xref: /llvm-project/clang/test/Parser/cxx-invalid-function-decl.cpp (revision 79de17d3af0b3f6d0fdd0baa4f41d5ac50ccd6d7)
1*79de17d3SAlexey Bataev // RUN: %clang_cc1 -fsyntax-only -verify %s
2*79de17d3SAlexey Bataev 
3*79de17d3SAlexey Bataev // Check that "::new" and "::delete" in member initializer list are diagnosed
4*79de17d3SAlexey Bataev // correctly and don't lead to infinite loop on parsing.
5*79de17d3SAlexey Bataev 
6*79de17d3SAlexey Bataev // Error: X() (initializer on non-constructor), "::new" is skipped.
f1()7*79de17d3SAlexey Bataev void f1() : X() ::new{}; // expected-error{{only constructors take base initializers}}
8*79de17d3SAlexey Bataev 
9*79de17d3SAlexey Bataev // Errors: first "::delete" and initializer on non-constructor, others skipped.
f2()10*79de17d3SAlexey Bataev void f2() : ::delete, ::new, X() ::new ::delete{} // expected-error{{expected class member or base class name}}
11*79de17d3SAlexey Bataev                                                   // expected-error@-1{{only constructors take base initializers}}
12*79de17d3SAlexey Bataev 
13*79de17d3SAlexey Bataev // Errors: the '::' token, "::delete" and initializer on non-constructor, others skipped.
f3()14*79de17d3SAlexey Bataev void f3() : ::, ::delete X(), ::new {}; // expected-error2{{expected class member or base class name}}
15*79de17d3SAlexey Bataev                                         // expected-error@-1{{only constructors take base initializers}}
16*79de17d3SAlexey Bataev 
17*79de17d3SAlexey Bataev template <class T>
18*79de17d3SAlexey Bataev struct Base1 {
19*79de17d3SAlexey Bataev   T x1;
Base1Base120*79de17d3SAlexey Bataev   Base1(T a1) : x1(a1) {}
21*79de17d3SAlexey Bataev };
22*79de17d3SAlexey Bataev 
23*79de17d3SAlexey Bataev template <class T>
24*79de17d3SAlexey Bataev struct Base2 {
25*79de17d3SAlexey Bataev   T x2;
Base2Base226*79de17d3SAlexey Bataev   Base2(T a2) : x2(a2) {}
27*79de17d3SAlexey Bataev };
28*79de17d3SAlexey Bataev 
29*79de17d3SAlexey Bataev struct S : public Base1<int>, public Base2<float> {
30*79de17d3SAlexey Bataev   int x;
31*79de17d3SAlexey Bataev 
32*79de17d3SAlexey Bataev   // 1-st initializer is correct (just missing ','), 2-nd incorrect, skip other.
SS33*79de17d3SAlexey Bataev   S() : ::Base1<int>(0) ::new, ::Base2<float>(1.0) ::delete x(2) {} // expected-error{{expected class member or base class name}}
34*79de17d3SAlexey Bataev                                                                     // expected-error@-1{{missing ',' between base or member initializers}}
35*79de17d3SAlexey Bataev 
36*79de17d3SAlexey Bataev   // 1-st and 2-nd are correct, errors: '::' and "::new", others skipped.
SS37*79de17d3SAlexey Bataev   S(int a) : Base1<int>(a), ::Base2<float>(1.0), ::, // expected-error{{expected class member or base class name}}
38*79de17d3SAlexey Bataev              ::new, ! ::delete, ::Base2<() x(3) {}   // expected-error{{expected class member or base class name}}
39*79de17d3SAlexey Bataev 
40*79de17d3SAlexey Bataev   // All initializers are correct, nothing to skip, diagnose 2 missing commas.
SS41*79de17d3SAlexey Bataev   S(const S &) : Base1<int>(0) ::Base2<float>(1.0) x(2) {} // expected-error2{{missing ',' between base or member initializers}}
42*79de17d3SAlexey Bataev };
43