// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 %s // RUN: not %clang_cc1 -fsyntax-only -ast-dump %s -std=c++17 | FileCheck %s void test() { while(!!!) // expected-error {{expected expression}} int whileBody; // CHECK: WhileStmt // CHECK: RecoveryExpr {{.*}} 'bool' // CHECK: whileBody 'int' for(!!!) // expected-error {{expected expression}} expected-error {{expected ';'}} int forBody; // CHECK: ForStmt // FIXME: the AST should have a RecoveryExpr to distinguish from for(;;) // CHECK-NOT: RecoveryExpr // CHECK: forBody 'int' for(auto c : !!!) // expected-error {{expected expression}} int forEachBody; // FIXME: parse the foreach body // CHECK-NOT: CXXForRangeStmt // CHECK-NOT: forEachBody 'int' do int doBody; while(!!!); // expected-error {{expected expression}} // CHECK: DoStmt // CHECK: doBody 'int' // CHECK: RecoveryExpr {{.*}} 'bool' if(!!!) // expected-error {{expected expression}} int ifBody; else int elseBody; // CHECK: IfStmt // CHECK: RecoveryExpr {{.*}} 'bool' // CHECK: ifBody 'int' // CHECK: elseBody 'int' switch(!!!) // expected-error {{expected expression}} int switchBody; // CHECK: SwitchStmt // CHECK: RecoveryExpr {{.*}} 'int' // CHECK: switchBody 'int' switch (;) // expected-error {{expected expression}} int switchBody; // CHECK: SwitchStmt // CHECK: NullStmt // CHECK: RecoveryExpr {{.*}} 'int' // CHECK: switchBody 'int' switch (;;) // expected-error {{expected expression}} int switchBody; // CHECK: SwitchStmt // CHECK: NullStmt // CHECK: RecoveryExpr {{.*}} 'int' // CHECK: switchBody 'int' switch (!!!;) // expected-error {{expected expression}} int switchBody; // CHECK: SwitchStmt // CHECK: RecoveryExpr {{.*}} 'int' // CHECK: switchBody 'int' }