1 | // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -fcxx-exceptions %s |
2 | // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -fcxx-exceptions -std=c++98 %s |
3 | // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -fcxx-exceptions -std=c++11 %s |
4 | |
5 | class C; |
6 | class C { |
7 | public: |
8 | protected: |
9 | typedef int A,B; |
10 | static int sf(), u; |
11 | |
12 | struct S {}; |
13 | enum {}; // expected-warning{{declaration does not declare anything}} |
14 | int; // expected-warning {{declaration does not declare anything}} |
15 | int : 1, : 2; |
16 | |
17 | public: |
18 | void m0() {}; // ok, one extra ';' is permitted |
19 | void m1() {} |
20 | ; // ok, one extra ';' is permitted |
21 | void m() { |
22 | int l = 2; |
23 | };; // expected-warning{{extra ';' after member function definition}} |
24 | |
25 | template<typename T> void mt(T) { } |
26 | ; |
27 | ; // expected-warning{{extra ';' inside a class}} |
28 | |
29 | virtual int vf() const volatile = 0; |
30 | |
31 | virtual int vf0() = 0l; // expected-error {{does not look like a pure-specifier}} |
32 | virtual int vf1() = 1; // expected-error {{does not look like a pure-specifier}} |
33 | virtual int vf2() = 00; // expected-error {{does not look like a pure-specifier}} |
34 | virtual int vf3() = 0x0; // expected-error {{does not look like a pure-specifier}} |
35 | virtual int vf4() = 0.0; // expected-error {{does not look like a pure-specifier}} |
36 | virtual int vf5(){0}; // expected-error +{{}} expected-warning {{unused}} |
37 | virtual int vf5a(){0;}; // function definition, expected-warning {{unused}} |
38 | virtual int vf6()(0); // expected-error +{{}} expected-note +{{}} |
39 | virtual int vf7() = { 0 }; // expected-error {{does not look like a pure-specifier}} |
40 | |
41 | private: |
42 | int x,f(),y,g(); |
43 | inline int h(); |
44 | static const int sci = 10; |
45 | mutable int mi; |
46 | }; |
47 | void glo() |
48 | { |
49 | struct local {}; |
50 | } |
51 | |
52 | // PR3177 |
53 | typedef union { |
54 | __extension__ union { |
55 | int a; |
56 | float b; |
57 | } y; |
58 | } bug3177; |
59 | |
60 | // check that we don't consume the token after the access specifier |
61 | // when it's not a colon |
62 | class D { |
63 | public // expected-error{{expected ':'}} |
64 | int i; |
65 | }; |
66 | |
67 | // consume the token after the access specifier if it's a semicolon |
68 | // that was meant to be a colon |
69 | class E { |
70 | public; // expected-error{{expected ':'}} |
71 | int i; |
72 | }; |
73 | |
74 | class F { |
75 | int F1 { return 1; } |
76 | #if __cplusplus <= 199711L |
77 | // expected-error@-2 {{function definition does not declare parameters}} |
78 | #else |
79 | // expected-error@-4 {{expected expression}} |
80 | // expected-error@-5 {{expected}} |
81 | // expected-note@-6 {{to match this '{'}} |
82 | // expected-error@-7 {{expected ';' after class}} |
83 | #endif |
84 | |
85 | void F2 {} |
86 | #if __cplusplus <= 199711L |
87 | // expected-error@-2 {{function definition does not declare parameters}} |
88 | #else |
89 | // expected-error@-4 {{variable has incomplete type 'void'}} |
90 | // expected-error@-5 {{expected ';' after top level declarator}} |
91 | #endif |
92 | |
93 | typedef int F3() { return 0; } // expected-error{{function definition declared 'typedef'}} |
94 | typedef void F4() {} // expected-error{{function definition declared 'typedef'}} |
95 | }; |
96 | #if __cplusplus >= 201103L |
97 | // expected-error@-2 {{extraneous closing brace}} |
98 | #endif |
99 | |
100 | namespace ctor_error { |
101 | class Foo {}; |
102 | // By [class.qual]p2, this is a constructor declaration. |
103 | Foo::Foo (F) = F(); // expected-error{{does not match any declaration in 'ctor_error::Foo'}} |
104 | |
105 | class Ctor { // expected-note{{not complete until the closing '}'}} |
106 | Ctor(f)(int); // ok |
107 | Ctor(g(int)); // ok |
108 | Ctor(x[5]); // expected-error{{incomplete type}} |
109 | |
110 | Ctor(UnknownType *); // expected-error{{unknown type name 'UnknownType'}} |
111 | void operator+(UnknownType*); // expected-error{{unknown type name 'UnknownType'}} |
112 | }; |
113 | |
114 | Ctor::Ctor (x) = { 0 }; // \ |
115 | // expected-error{{qualified reference to 'Ctor' is a constructor name}} |
116 | |
117 | Ctor::Ctor(UnknownType *) {} // \ |
118 | // expected-error{{unknown type name 'UnknownType'}} |
119 | void Ctor::operator+(UnknownType*) {} // \ |
120 | // expected-error{{unknown type name 'UnknownType'}} |
121 | } |
122 | |
123 | namespace nns_decl { |
124 | struct A { |
125 | struct B; |
126 | }; |
127 | namespace N { |
128 | union C; |
129 | } |
130 | struct A::B; // expected-error {{forward declaration of struct cannot have a nested name specifier}} |
131 | union N::C; // expected-error {{forward declaration of union cannot have a nested name specifier}} |
132 | } |
133 | |
134 | // PR13775: Don't assert here. |
135 | namespace PR13775 { |
136 | class bar |
137 | { |
138 | public: |
139 | void foo (); |
140 | void baz (); |
141 | }; |
142 | void bar::foo () |
143 | { |
144 | baz x(); // expected-error 3{{}} |
145 | } |
146 | } |
147 | |
148 | class pr16989 { |
149 | void tpl_mem(int *) { |
150 | return; |
151 | class C2 { |
152 | void f(); |
153 | }; |
154 | void C2::f() {} // expected-error{{function definition is not allowed here}} |
155 | }; |
156 | }; |
157 | |
158 | namespace CtorErrors { |
159 | struct A { |
160 | A(NonExistent); // expected-error {{unknown type name 'NonExistent'}} |
161 | }; |
162 | struct B { |
163 | B(NonExistent) : n(0) {} // expected-error {{unknown type name 'NonExistent'}} |
164 | int n; |
165 | }; |
166 | struct C { |
167 | C(NonExistent) try {} catch (...) {} // expected-error {{unknown type name 'NonExistent'}} |
168 | }; |
169 | struct D { |
170 | D(NonExistent) {} // expected-error {{unknown type name 'NonExistent'}} |
171 | }; |
172 | } |
173 | |
174 | namespace DtorErrors { |
175 | struct A { ~A(); int n; } a; |
176 | ~A::A() { n = 0; } // expected-error {{'~' in destructor name should be after nested name specifier}} expected-note {{previous}} |
177 | A::~A() {} // expected-error {{redefinition}} |
178 | |
179 | struct B { ~B(); } *b; |
180 | DtorErrors::~B::B() {} // expected-error {{'~' in destructor name should be after nested name specifier}} |
181 | |
182 | void f() { |
183 | a.~A::A(); // expected-error {{'~' in destructor name should be after nested name specifier}} |
184 | b->~DtorErrors::~B::B(); // expected-error {{'~' in destructor name should be after nested name specifier}} |
185 | } |
186 | |
187 | struct C; // expected-note {{forward decl}} |
188 | ~C::C() {} // expected-error {{incomplete}} expected-error {{'~' in destructor name should be after nested name specifier}} |
189 | |
190 | struct D { struct X {}; ~D() throw(X); }; |
191 | ~D::D() throw(X) {} // expected-error {{'~' in destructor name should be after nested name specifier}} |
192 | |
193 | ~Undeclared::Undeclared() {} // expected-error {{use of undeclared identifier 'Undeclared'}} expected-error {{'~' in destructor name should be after nested name specifier}} |
194 | ~Undeclared:: {} // expected-error {{expected identifier}} expected-error {{'~' in destructor name should be after nested name specifier}} |
195 | |
196 | struct S { |
197 | // For another struct's destructor, emit the same diagnostic like for |
198 | // A::~A() in addition to the "~ in the wrong place" one. |
199 | ~A::A() {} // expected-error {{'~' in destructor name should be after nested name specifier}} expected-error {{non-friend class member '~A' cannot have a qualified name}} |
200 | A::~A() {} // expected-error {{non-friend class member '~A' cannot have a qualified name}} |
201 | |
202 | // An inline destructor with a redundant class name should also get the |
203 | // same diagnostic as S::~S. |
204 | ~S::S() {} // expected-error {{'~' in destructor name should be after nested name specifier}} expected-error {{extra qualification on member '~S'}} |
205 | |
206 | // This just shouldn't crash. |
207 | int I; // expected-note {{declared here}} |
208 | ~I::I() {} // expected-error {{'I' is not a class, namespace, or enumeration}} expected-error {{'~' in destructor name should be after nested name specifier}} |
209 | }; |
210 | |
211 | struct T {}; |
212 | T t1 = t1.T::~T<int>; // expected-error {{destructor name 'T' does not refer to a template}} expected-error {{expected '(' for function-style cast or type construction}} expected-error {{expected expression}} |
213 | // Emit the same diagnostic as for the previous case, plus something about ~. |
214 | T t2 = t2.~T::T<int>; // expected-error {{'~' in destructor name should be after nested name specifier}} expected-error {{destructor name 'T' does not refer to a template}} expected-error {{expected '(' for function-style cast or type construction}} expected-error {{expected expression}} |
215 | } |
216 | |
217 | namespace BadFriend { |
218 | struct A { |
219 | friend int : 3; // expected-error {{friends can only be classes or functions}} |
220 | friend void f() = 123; // expected-error {{illegal initializer}} |
221 | friend virtual void f(); // expected-error {{'virtual' is invalid in friend declarations}} |
222 | friend void f() final; // expected-error {{'final' is invalid in friend declarations}} |
223 | friend void f() override; // expected-error {{'override' is invalid in friend declarations}} |
224 | }; |
225 | } |
226 | |
227 | class PR20760_a { |
228 | int a = ); // expected-error {{expected expression}} |
229 | #if __cplusplus <= 199711L |
230 | // expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}} |
231 | #endif |
232 | |
233 | int b = }; // expected-error {{expected expression}} |
234 | #if __cplusplus <= 199711L |
235 | // expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}} |
236 | #endif |
237 | |
238 | int c = ]; // expected-error {{expected expression}} |
239 | #if __cplusplus <= 199711L |
240 | // expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}} |
241 | #endif |
242 | |
243 | }; |
244 | class PR20760_b { |
245 | int d = d); // expected-error {{expected ';'}} |
246 | #if __cplusplus <= 199711L |
247 | // expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}} |
248 | #endif |
249 | |
250 | int e = d]; // expected-error {{expected ';'}} |
251 | #if __cplusplus <= 199711L |
252 | // expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}} |
253 | #endif |
254 | |
255 | int f = d // expected-error {{expected ';'}} |
256 | #if __cplusplus <= 199711L |
257 | // expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}} |
258 | #endif |
259 | |
260 | }; |
261 | |
262 | namespace PR20887 { |
263 | class X1 { a::operator=; }; // expected-error {{undeclared identifier 'a'}} |
264 | class X2 { a::a; }; // expected-error {{undeclared identifier 'a'}} |
265 | } |
266 | |
267 | class BadExceptionSpec { |
268 | void f() throw(int; // expected-error {{expected ')'}} expected-note {{to match}} |
269 | void g() throw( |
270 | int( |
271 | ; // expected-error {{unexpected ';' before ')'}} |
272 | )); |
273 | }; |
274 | |
275 | // PR11109 must appear at the end of the source file |
276 | class pr11109r3 { // expected-note{{to match this '{'}} |
277 | public // expected-error{{expected ':'}} expected-error{{expected '}'}} expected-error{{expected ';' after class}} |
278 | |