86 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s2 3// C++11 [class.mem]p2:4// A class is considered a completely-defined object type (or5// complete type) at the closing } of the class-specifier. Within6// the class member-specification, the class is regarded as complete7// within function bodies, default arguments,8// exception-specifications, and brace-or-equal-initializers for9// non-static data members (including such things in nested classes).10// Otherwise it is regarded as incomplete within its own class11// member-specification.12 13namespace test0 {14 struct A { // expected-note {{definition of 'test0::A' is not complete until the closing '}'}}15 A x; // expected-error {{field has incomplete type 'A'}}16 };17}18 19namespace test1 {20 template <class T> struct A {21 A<int> x; // expected-error {{implicit instantiation of template 'test1::A<int>' within its own definition}}22 };23}24 25namespace test2 {26 template <class T> struct A;27 template <> struct A<int> {};28 template <class T> struct A {29 A<int> x;30 };31}32 33namespace test3 {34 struct A {35 struct B {36 void f() throw(A);37 void g() throw(B);38 };39 40 void f() throw(A);41 void g() throw(B);42 };43 44 template<typename T>45 struct A2 {46 struct B {47 void f1() throw(A2);48 void f2() throw(A2<T>);49 void g() throw(B);50 };51 52 void f1() throw(A2);53 void f2() throw(A2<T>);54 void g() throw(B);55 };56 57 template struct A2<int>;58}59 60namespace PR12629 {61 struct S {62 static int (f)() throw();63 static int ((((((g))))() throw(U)));64 int (*h)() noexcept(false);65 static int (&i)() noexcept(true);66 static int (*j)() throw(U); // expected-error {{unknown type name 'U'}}67 static int (k)() throw(U);68 69 struct U {};70 };71 static_assert(noexcept(S::f()), "");72 static_assert(!noexcept(S::g()), "");73 static_assert(!noexcept(S().h()), "");74 static_assert(noexcept(S::i()), "");75}76 77namespace PR12688 {78 struct S {79 // FIXME: Maybe suppress the "constructor cannot have a return type" error80 // if the return type is invalid.81 nonsense S() throw (more_nonsense); // \82 // expected-error {{'nonsense'}} \83 // expected-error {{constructor cannot have a return type}}84 };85}86