1*27ea0c4eSSam McCall // RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 %s
2*27ea0c4eSSam McCall // RUN: not %clang_cc1 -fsyntax-only -ast-dump %s -std=c++17 | FileCheck %s
3*27ea0c4eSSam McCall 
test()4*27ea0c4eSSam McCall void test() {
5*27ea0c4eSSam McCall   while(!!!) // expected-error {{expected expression}}
6*27ea0c4eSSam McCall     int whileBody;
7*27ea0c4eSSam McCall   // CHECK: WhileStmt
8*27ea0c4eSSam McCall   // CHECK: RecoveryExpr {{.*}} <line:{{.*}}:9, col:11> 'bool'
9*27ea0c4eSSam McCall   // CHECK: whileBody 'int'
10*27ea0c4eSSam McCall 
11*27ea0c4eSSam McCall   for(!!!) // expected-error {{expected expression}} expected-error {{expected ';'}}
12*27ea0c4eSSam McCall     int forBody;
13*27ea0c4eSSam McCall   // CHECK: ForStmt
14*27ea0c4eSSam McCall   // FIXME: the AST should have a RecoveryExpr to distinguish from for(;;)
15*27ea0c4eSSam McCall   // CHECK-NOT: RecoveryExpr
16*27ea0c4eSSam McCall   // CHECK: forBody 'int'
17*27ea0c4eSSam McCall 
18*27ea0c4eSSam McCall   for(auto c : !!!) // expected-error {{expected expression}}
19*27ea0c4eSSam McCall     int forEachBody;
20*27ea0c4eSSam McCall   // FIXME: parse the foreach body
21*27ea0c4eSSam McCall   // CHECK-NOT: CXXForRangeStmt
22*27ea0c4eSSam McCall   // CHECK-NOT: forEachBody 'int'
23*27ea0c4eSSam McCall 
24*27ea0c4eSSam McCall   do
25*27ea0c4eSSam McCall     int doBody;
26*27ea0c4eSSam McCall   while(!!!); // expected-error {{expected expression}}
27*27ea0c4eSSam McCall   // CHECK: DoStmt
28*27ea0c4eSSam McCall   // CHECK: doBody 'int'
29*27ea0c4eSSam McCall   // CHECK: RecoveryExpr {{.*}} <line:{{.*}}:9, col:11> 'bool'
30*27ea0c4eSSam McCall 
31*27ea0c4eSSam McCall   if(!!!) // expected-error {{expected expression}}
32*27ea0c4eSSam McCall     int ifBody;
33*27ea0c4eSSam McCall   else
34*27ea0c4eSSam McCall     int elseBody;
35*27ea0c4eSSam McCall   // CHECK: IfStmt
36*27ea0c4eSSam McCall   // CHECK: RecoveryExpr {{.*}} <line:{{.*}}:6, col:8> 'bool'
37*27ea0c4eSSam McCall   // CHECK: ifBody 'int'
38*27ea0c4eSSam McCall   // CHECK: elseBody 'int'
39*27ea0c4eSSam McCall 
40*27ea0c4eSSam McCall   switch(!!!) // expected-error {{expected expression}}
41*27ea0c4eSSam McCall     int switchBody;
42*27ea0c4eSSam McCall   // CHECK: SwitchStmt
43*27ea0c4eSSam McCall   // CHECK: RecoveryExpr {{.*}} <line:{{.*}}:10, col:12> 'int'
44*27ea0c4eSSam McCall   // CHECK: switchBody 'int'
45*27ea0c4eSSam McCall 
46*27ea0c4eSSam McCall   switch (;) // expected-error {{expected expression}}
47*27ea0c4eSSam McCall     int switchBody;
48*27ea0c4eSSam McCall   // CHECK: SwitchStmt
49*27ea0c4eSSam McCall   // CHECK: NullStmt
50*27ea0c4eSSam McCall   // CHECK: RecoveryExpr {{.*}} <col:11> 'int'
51*27ea0c4eSSam McCall   // CHECK: switchBody 'int'
52*27ea0c4eSSam McCall 
53*27ea0c4eSSam McCall   switch (;;) // expected-error {{expected expression}}
54*27ea0c4eSSam McCall     int switchBody;
55*27ea0c4eSSam McCall   // CHECK: SwitchStmt
56*27ea0c4eSSam McCall   // CHECK: NullStmt
57*27ea0c4eSSam McCall   // CHECK: RecoveryExpr {{.*}} <col:11, col:12> 'int'
58*27ea0c4eSSam McCall   // CHECK: switchBody 'int'
59*27ea0c4eSSam McCall 
60*27ea0c4eSSam McCall   switch (!!!;) // expected-error {{expected expression}}
61*27ea0c4eSSam McCall     int switchBody;
62*27ea0c4eSSam McCall   // CHECK: SwitchStmt
63*27ea0c4eSSam McCall   // CHECK: RecoveryExpr {{.*}} <line:{{.*}}:11, col:14> 'int'
64*27ea0c4eSSam McCall   // CHECK: switchBody 'int'
65*27ea0c4eSSam McCall }
66