diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:23:48 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:23:48 +0000 | 
| commit | 06d4ba388873e6d1cfa9cd715a8935ecc8cd2097 (patch) | |
| tree | 3eb853da77d46cc77c4b017525a422f9ddb1385b /test/SemaCXX/implicit-exception-spec.cpp | |
| parent | 30d791273d07fac9c0c1641a0731191bca6e8606 (diff) | |
Diffstat (limited to 'test/SemaCXX/implicit-exception-spec.cpp')
| -rw-r--r-- | test/SemaCXX/implicit-exception-spec.cpp | 35 | 
1 files changed, 18 insertions, 17 deletions
| diff --git a/test/SemaCXX/implicit-exception-spec.cpp b/test/SemaCXX/implicit-exception-spec.cpp index e26f985f0d0a..ff3d685d912e 100644 --- a/test/SemaCXX/implicit-exception-spec.cpp +++ b/test/SemaCXX/implicit-exception-spec.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -std=c++11 -Wall %s +// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -std=c++11 -Wall -Wno-unused-local-typedefs %s  template<bool b> struct ExceptionIf { static int f(); };  template<> struct ExceptionIf<false> { typedef int f; }; @@ -17,42 +17,43 @@ namespace InClassInitializers {    // is false.    bool ThrowSomething() noexcept(false);    struct ConstExpr { -    bool b = noexcept(ConstExpr()) && ThrowSomething(); // expected-error {{cannot be used by non-static data member initializer}} +    bool b = noexcept(ConstExpr()) && ThrowSomething(); // expected-error {{cannot use defaulted default constructor of 'ConstExpr' within the class outside of member functions}} +  // expected-note@-1 {{implicit default constructor for 'InClassInitializers::ConstExpr' first required here}}    }; -  // We can use it now. -  bool w = noexcept(ConstExpr());    // Much more obviously broken: we can't parse the initializer without already    // knowing whether it produces a noexcept expression.    struct TemplateArg { -    int n = ExceptionIf<noexcept(TemplateArg())>::f(); // expected-error {{cannot be used by non-static data member initializer}} +    int n = ExceptionIf<noexcept(TemplateArg())>::f(); // expected-error {{cannot use defaulted default constructor of 'TemplateArg' within the class outside of member functions}} +    // expected-note@-1 {{implicit default constructor for 'InClassInitializers::TemplateArg' first required here}}    }; -  bool x = noexcept(TemplateArg());    // And within a nested class. -  struct Nested { // expected-error {{cannot be used by non-static data member initializer}} +  struct Nested { // expected-note {{implicit default constructor for 'InClassInitializers::Nested::Inner' first required here}}      struct Inner { +      // expected-error@+1 {{cannot use defaulted default constructor of 'Inner' within 'Nested' outside of member functions}}        int n = ExceptionIf<noexcept(Nested())>::f(); // expected-note {{implicit default constructor for 'InClassInitializers::Nested' first required here}}      } inner;    }; -  struct Nested2 { +  struct Nested2 { // expected-error {{implicit default constructor for 'InClassInitializers::Nested2' must explicitly initialize the member 'inner' which does not have a default constructor}}      struct Inner; -    int n = Inner().n; // expected-error {{cannot be used by non-static data member initializer}} -    struct Inner { +    int n = Inner().n; // expected-note {{implicit default constructor for 'InClassInitializers::Nested2::Inner' first required here}} +    struct Inner { // expected-note {{declared here}} +      // expected-error@+1 {{cannot use defaulted default constructor of 'Inner' within 'Nested2' outside of member functions}}        int n = ExceptionIf<noexcept(Nested2())>::f(); -    } inner; +      // expected-note@-1 {{implicit default constructor for 'InClassInitializers::Nested2' first required here}} +    } inner; // expected-note {{member is declared here}}    };  }  namespace ExceptionSpecification { -  // A type is permitted to be used in a dynamic exception specification when it -  // is still being defined, but isn't complete within such an exception -  // specification. -  struct Nested { // expected-note {{not complete}} +  // FIXME: This diagnostic is quite useless; we should indicate whose +  // exception specification we were looking for and why. +  struct Nested {      struct T { -      T() noexcept(!noexcept(Nested())); // expected-error{{incomplete type}} -    } t; +      T() noexcept(!noexcept(Nested())); +    } t; // expected-error{{exception specification is not available until end of class definition}}    };  } | 
