1*67e74705SXin Li // RUN: %clang_cc1 -verify -std=c++11 -fms-extensions %s
2*67e74705SXin Li
3*67e74705SXin Li 8gi///===--- recovery.cpp ---===// // expected-error {{unqualified-id}}
4*67e74705SXin Li namespace Std { // expected-note {{here}}
5*67e74705SXin Li typedef int Important;
6*67e74705SXin Li }
7*67e74705SXin Li
8*67e74705SXin Li / redeclare as an inline namespace // expected-error {{unqualified-id}}
9*67e74705SXin Li inline namespace Std { // expected-error {{cannot be reopened as inline}}
10*67e74705SXin Li Important n;
11*67e74705SXin Li } / end namespace Std // expected-error {{unqualified-id}}
12*67e74705SXin Li int x;
13*67e74705SXin Li Std::Important y;
14*67e74705SXin Li
15*67e74705SXin Li extenr "C" { // expected-error {{did you mean 'extern'}}
16*67e74705SXin Li void f();
17*67e74705SXin Li }
g()18*67e74705SXin Li void g() {
19*67e74705SXin Li z = 1; // expected-error {{undeclared}}
20*67e74705SXin Li f();
21*67e74705SXin Li }
22*67e74705SXin Li
23*67e74705SXin Li struct S {
24*67e74705SXin Li int a, b, c;
25*67e74705SXin Li S();
26*67e74705SXin Li int x // expected-error {{expected ';'}}
27*67e74705SXin Li friend void f()
28*67e74705SXin Li };
S()29*67e74705SXin Li 8S::S() : a{ 5 }, b{ 6 }, c{ 2 } { // expected-error {{unqualified-id}}
30*67e74705SXin Li return;
31*67e74705SXin Li }
32*67e74705SXin Li int k;
33*67e74705SXin Li int l = k // expected-error {{expected ';'}}
34*67e74705SXin Li constexpr int foo();
35*67e74705SXin Li
36*67e74705SXin Li 5int m = { l }, n = m; // expected-error {{unqualified-id}}
37*67e74705SXin Li
38*67e74705SXin Li namespace MissingBrace {
39*67e74705SXin Li struct S { // expected-error {{missing '}' at end of definition of 'MissingBrace::S'}}
40*67e74705SXin Li int f();
41*67e74705SXin Li // };
42*67e74705SXin Li
43*67e74705SXin Li namespace N { int g(); } // expected-note {{still within definition of 'MissingBrace::S' here}}
44*67e74705SXin Li
45*67e74705SXin Li int k1 = S().h(); // expected-error {{no member named 'h' in 'MissingBrace::S'}}
46*67e74705SXin Li int k2 = S().f() + N::g();
47*67e74705SXin Li
48*67e74705SXin Li template<typename T> struct PR17949 { // expected-error {{missing '}' at end of definition of 'MissingBrace::PR17949'}}
49*67e74705SXin Li
50*67e74705SXin Li namespace X { // expected-note {{still within definition of 'MissingBrace::PR17949' here}}
51*67e74705SXin Li }
52*67e74705SXin Li }
53*67e74705SXin Li
54*67e74705SXin Li namespace N {
55*67e74705SXin Li int
56*67e74705SXin Li } // expected-error {{unqualified-id}}
57*67e74705SXin Li
58*67e74705SXin Li strcut Uuuu { // expected-error {{did you mean 'struct'}} \
59*67e74705SXin Li // expected-note {{'Uuuu' declared here}}
60*67e74705SXin Li } *u[3];
61*67e74705SXin Li uuuu v; // expected-error {{did you mean 'Uuuu'}}
62*67e74705SXin Li
63*67e74705SXin Li struct Redefined { // expected-note {{previous}}
64*67e74705SXin Li Redefined() {}
65*67e74705SXin Li };
66*67e74705SXin Li struct Redefined { // expected-error {{redefinition}}
67*67e74705SXin Li Redefined() {}
68*67e74705SXin Li };
69*67e74705SXin Li
70*67e74705SXin Li struct MissingSemi5;
71*67e74705SXin Li namespace N {
72*67e74705SXin Li typedef int afterMissingSemi4;
73*67e74705SXin Li extern MissingSemi5 afterMissingSemi5;
74*67e74705SXin Li }
75*67e74705SXin Li
76*67e74705SXin Li struct MissingSemi1 {} // expected-error {{expected ';' after struct}}
77*67e74705SXin Li static int afterMissingSemi1();
78*67e74705SXin Li
79*67e74705SXin Li class MissingSemi2 {} // expected-error {{expected ';' after class}}
80*67e74705SXin Li MissingSemi1 *afterMissingSemi2;
81*67e74705SXin Li
82*67e74705SXin Li enum MissingSemi3 {} // expected-error {{expected ';' after enum}}
83*67e74705SXin Li ::MissingSemi1 afterMissingSemi3;
84*67e74705SXin Li
85*67e74705SXin Li extern N::afterMissingSemi4 afterMissingSemi4b;
86*67e74705SXin Li union MissingSemi4 { MissingSemi4(int); } // expected-error {{expected ';' after union}}
87*67e74705SXin Li N::afterMissingSemi4 (afterMissingSemi4b);
88*67e74705SXin Li
89*67e74705SXin Li int afterMissingSemi5b;
90*67e74705SXin Li struct MissingSemi5 { MissingSemi5(int); } // ok, no missing ';' here
91*67e74705SXin Li N::afterMissingSemi5 (afterMissingSemi5b);
92*67e74705SXin Li
93*67e74705SXin Li template<typename T> struct MissingSemiT {
94*67e74705SXin Li } // expected-error {{expected ';' after struct}}
95*67e74705SXin Li MissingSemiT<int> msi;
96*67e74705SXin Li
97*67e74705SXin Li struct MissingSemiInStruct {
98*67e74705SXin Li struct Inner1 {} // expected-error {{expected ';' after struct}}
99*67e74705SXin Li static MissingSemi5 ms1;
100*67e74705SXin Li
101*67e74705SXin Li struct Inner2 {} // ok, no missing ';' here
102*67e74705SXin Li static MissingSemi1;
103*67e74705SXin Li
104*67e74705SXin Li struct Inner3 {} // expected-error {{expected ';' after struct}}
105*67e74705SXin Li static MissingSemi5 *p;
106*67e74705SXin Li };
107*67e74705SXin Li
108*67e74705SXin Li void MissingSemiInFunction() {
109*67e74705SXin Li struct Inner1 {} // expected-error {{expected ';' after struct}}
110*67e74705SXin Li if (true) {}
111*67e74705SXin Li
112*67e74705SXin Li // FIXME: It would be nice to at least warn on this.
113*67e74705SXin Li struct Inner2 { Inner2(int); } // ok, no missing ';' here
114*67e74705SXin Li k = l;
115*67e74705SXin Li
116*67e74705SXin Li struct Inner3 {} // expected-error {{expected ';' after struct}}
117*67e74705SXin Li Inner1 i1;
118*67e74705SXin Li
119*67e74705SXin Li struct Inner4 {} // ok, no missing ';' here
120*67e74705SXin Li Inner5;
121*67e74705SXin Li }
122*67e74705SXin Li
123*67e74705SXin Li namespace NS {
124*67e74705SXin Li template<typename T> struct Foo {};
125*67e74705SXin Li }
126*67e74705SXin Li struct MissingSemiThenTemplate1 {} // expected-error {{expected ';' after struct}}
127*67e74705SXin Li NS::Foo<int> missingSemiBeforeFunctionReturningTemplateId1();
128*67e74705SXin Li
129*67e74705SXin Li using NS::Foo;
130*67e74705SXin Li struct MissingSemiThenTemplate2 {} // expected-error {{expected ';' after struct}}
131*67e74705SXin Li Foo<int> missingSemiBeforeFunctionReturningTemplateId2();
132*67e74705SXin Li
133*67e74705SXin Li namespace PR17084 {
134*67e74705SXin Li enum class EnumID {};
135*67e74705SXin Li template <typename> struct TempID;
136*67e74705SXin Li template <> struct TempID<BadType> : BadType, EnumID::Garbage; // expected-error{{use of undeclared identifier 'BadType'}}
137*67e74705SXin Li }
138*67e74705SXin Li
139*67e74705SXin Li namespace pr15133 {
140*67e74705SXin Li namespace ns {
141*67e74705SXin Li const int V1 = 1; // expected-note {{declared here}}
142*67e74705SXin Li }
143*67e74705SXin Li struct C1 {
144*67e74705SXin Li enum E1 { V2 = 2 }; // expected-note {{declared here}}
145*67e74705SXin Li static const int V3 = 3; // expected-note {{declared here}}
146*67e74705SXin Li };
147*67e74705SXin Li enum E2 {
148*67e74705SXin Li V4 = 4, // expected-note {{declared here}}
149*67e74705SXin Li V6 // expected-note {{declared here}}
150*67e74705SXin Li };
151*67e74705SXin Li enum class EC3 { V0 = 0, V5 = 5 }; // expected-note {{declared here}}
152*67e74705SXin Li void func_3();
153*67e74705SXin Li
154*67e74705SXin Li void func_1(int x) {
155*67e74705SXin Li switch(x) {
156*67e74705SXin Li case 0: break;
157*67e74705SXin Li case ns::V1:: break; // expected-error{{'V1' cannot appear before '::' because it is not a class, namespace, or enumeration; did you mean ':'?}}
158*67e74705SXin Li case C1::V2:: break; // expected-error{{'V2' cannot appear before '::' because it is not a class, namespace, or enumeration; did you mean ':'?}}
159*67e74705SXin Li case C1::V3:: break; // expected-error{{'V3' cannot appear before '::' because it is not a class, namespace, or enumeration; did you mean ':'?}}
160*67e74705SXin Li case V4:: break; // expected-error{{'V4' cannot appear before '::' because it is not a class, namespace, or enumeration; did you mean ':'?}}
161*67e74705SXin Li case V6:: func_3(); // expected-error{{'V6' cannot appear before '::' because it is not a class, namespace, or enumeration; did you mean ':'?}}
162*67e74705SXin Li }
163*67e74705SXin Li }
164*67e74705SXin Li void func_2(EC3 x) {
165*67e74705SXin Li switch(x) {
166*67e74705SXin Li case EC3::V0: break;
167*67e74705SXin Li case EC3::V5:: break; // expected-error{{'V5' cannot appear before '::' because it is not a class, namespace, or enumeration; did you mean ':'?}}
168*67e74705SXin Li }
169*67e74705SXin Li }
170*67e74705SXin Li
171*67e74705SXin Li template<class T> struct TS1 {
172*67e74705SXin Li typedef int A;
173*67e74705SXin Li };
174*67e74705SXin Li template<class T> void func(int x) {
175*67e74705SXin Li switch(x) {
176*67e74705SXin Li case TS1<T>::A:: break; // expected-error{{expected unqualified-id}}
177*67e74705SXin Li }
178*67e74705SXin Li };
179*67e74705SXin Li void mainf() {
180*67e74705SXin Li func<int>(1);
181*67e74705SXin Li }
182*67e74705SXin Li
183*67e74705SXin Li struct S {
184*67e74705SXin Li static int n; // expected-note{{declared here}}
185*67e74705SXin Li int nn; // expected-note 2 {{declared here}}
186*67e74705SXin Li };
187*67e74705SXin Li
188*67e74705SXin Li int func_3(int x) {
189*67e74705SXin Li return x ? S::n :: 0; // expected-error{{'n' cannot appear before '::' because it is not a class, namespace, or enumeration; did you mean ':'?}}
190*67e74705SXin Li }
191*67e74705SXin Li int func_4(int x, S &s) {
192*67e74705SXin Li return x ? s.nn :: x; // expected-error{{'nn' cannot appear before '::' because it is not a class, namespace, or enumeration; did you mean ':'?}}
193*67e74705SXin Li }
194*67e74705SXin Li int func_5(int x, S &s) {
195*67e74705SXin Li return x ? s.nn :: S::n; // expected-error{{'nn' cannot appear before '::' because it is not a class, namespace, or enumeration; did you mean ':'?}}
196*67e74705SXin Li }
197*67e74705SXin Li
198*67e74705SXin Li struct S2 {
199*67e74705SXin Li struct S3;
200*67e74705SXin Li };
201*67e74705SXin Li
202*67e74705SXin Li struct S2 :: S3 :: public S2 { // expected-error{{'public' cannot be a part of nested name specifier; did you mean ':'?}}
203*67e74705SXin Li };
204*67e74705SXin Li }
205*67e74705SXin Li
206*67e74705SXin Li namespace InvalidEmptyNames {
207*67e74705SXin Li // These shouldn't crash, the diagnostics aren't important.
208*67e74705SXin Li struct ::, struct ::; // expected-error 2 {{expected identifier}} expected-error 2 {{declaration of anonymous struct must be a definition}} expected-warning {{declaration does not declare anything}}
209*67e74705SXin Li enum ::, enum ::; // expected-error 2 {{expected identifier}} expected-warning {{declaration does not declare anything}}
210*67e74705SXin Li struct ::__super, struct ::__super; // expected-error 2 {{expected identifier}} expected-error 2 {{expected '::' after '__super'}}
211*67e74705SXin Li struct ::template foo, struct ::template bar; // expected-error 2 {{expected identifier}} expected-error 2 {{declaration of anonymous struct must be a definition}} expected-warning {{declaration does not declare anything}}
212*67e74705SXin Li struct ::foo struct::; // expected-error {{no struct named 'foo' in the global namespace}} expected-error {{expected identifier}} expected-error {{declaration of anonymous struct must be a definition}}
213*67e74705SXin Li class :: : {} a; // expected-error {{expected identifier}} expected-error {{expected class name}}
214*67e74705SXin Li }
215