1 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
2 | |
3 | // C++11 [class.mem]p2: |
4 | // A class is considered a completely-defined object type (or |
5 | // complete type) at the closing } of the class-specifier. Within |
6 | // the class member-specification, the class is regarded as complete |
7 | // within function bodies, default arguments, |
8 | // exception-specifications, and brace-or-equal-initializers for |
9 | // non-static data members (including such things in nested classes). |
10 | // Otherwise it is regarded as incomplete within its own class |
11 | // member-specification. |
12 | |
13 | namespace 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 'test0::A'}} |
16 | }; |
17 | } |
18 | |
19 | namespace 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 | |
25 | namespace 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 | |
33 | namespace 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 | |
60 | namespace 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 | |
77 | namespace PR12688 { |
78 | struct S { |
79 | // FIXME: Maybe suppress the "constructor cannot have a return type" error |
80 | // 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 | |