| // Test without serialization: |
| // RUN: %clang_cc1 -std=gnu11 -ast-dump %s \ |
| // RUN: | FileCheck -strict-whitespace %s |
| // |
| // Test with serialization: |
| // RUN: %clang_cc1 -std=gnu11 -emit-pch -o %t %s |
| // RUN: %clang_cc1 -x c -std=gnu11 -include-pch %t -ast-dump-all /dev/null \ |
| // RUN: | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" \ |
| // RUN: | FileCheck -strict-whitespace %s |
| |
| int TestLocation = 0; |
| // CHECK: VarDecl{{.*}}TestLocation |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:20> 'int' 0 |
| |
| int TestIndent = 1 + (1); |
| // CHECK: VarDecl{{.*}}TestIndent |
| // CHECK-NEXT: {{^}}| `-BinaryOperator{{[^()]*$}} |
| // CHECK-NEXT: {{^}}| |-IntegerLiteral{{.*0[^()]*$}} |
| // CHECK-NEXT: {{^}}| `-ParenExpr{{.*0[^()]*$}} |
| // CHECK-NEXT: {{^}}| `-IntegerLiteral{{.*0[^()]*$}} |
| |
| void TestDeclStmt() { |
| int x = 0; |
| int y, z; |
| } |
| // CHECK: FunctionDecl{{.*}}TestDeclStmt |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: DeclStmt |
| // CHECK-NEXT: VarDecl{{.*}}x |
| // CHECK-NEXT: IntegerLiteral |
| // CHECK-NEXT: DeclStmt |
| // CHECK-NEXT: VarDecl{{.*}}y |
| // CHECK-NEXT: VarDecl{{.*}}z |
| |
| int TestOpaqueValueExpr = 0 ?: 1; |
| // CHECK: VarDecl{{.*}}TestOpaqueValueExpr |
| // CHECK-NEXT: BinaryConditionalOperator |
| // CHECK-NEXT: IntegerLiteral |
| // CHECK-NEXT: OpaqueValueExpr |
| // CHECK-NEXT: IntegerLiteral |
| // CHECK-NEXT: OpaqueValueExpr |
| // CHECK-NEXT: IntegerLiteral |
| // CHECK-NEXT: IntegerLiteral |
| |
| void TestUnaryOperatorExpr(void) { |
| char T1 = 1; |
| int T2 = 1; |
| |
| T1++; |
| T2++; |
| // CHECK: UnaryOperator{{.*}}postfix '++' cannot overflow |
| // CHECK-NEXT: DeclRefExpr{{.*}}'T1' 'char' |
| // CHECK-NOT: UnaryOperator{{.*}}postfix '++' cannot overflow |
| // CHECK: DeclRefExpr{{.*}}'T2' 'int' |
| |
| -T1; |
| -T2; |
| // CHECK: UnaryOperator{{.*}}prefix '-' cannot overflow |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr{{.*}}'T1' 'char' |
| // CHECK-NOT: UnaryOperator{{.*}}prefix '-' cannot overflow |
| // CHECK: ImplicitCastExpr |
| // CHECK: DeclRefExpr{{.*}}'T2' 'int' |
| |
| ~T1; |
| ~T2; |
| // CHECK: UnaryOperator{{.*}}prefix '~' cannot overflow |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr{{.*}}'T1' 'char' |
| // CHECK: UnaryOperator{{.*}}prefix '~' cannot overflow |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr{{.*}}'T2' 'int' |
| } |
| |
| void TestGenericSelectionExpressions(int i) { |
| _Generic(i, int : 12); |
| // CHECK: GenericSelectionExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:23> 'int' |
| // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int' |
| // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int' |
| // FIXME: note that the following test line has a spurious whitespace. |
| // CHECK-NEXT: case 'int' selected |
| // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:21> 'int' 12 |
| _Generic(i, int : 12, default : 0); |
| // CHECK: GenericSelectionExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:36> 'int' |
| // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int' |
| // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int' |
| // FIXME: note that the following test line has a spurious whitespace. |
| // CHECK-NEXT: case 'int' selected |
| // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:21> 'int' 12 |
| // CHECK-NEXT: default |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:35> 'int' 0 |
| _Generic(i, default : 0, int : 12); |
| // CHECK: GenericSelectionExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:36> 'int' |
| // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int' |
| // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int' |
| // CHECK-NEXT: default |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:25> 'int' 0 |
| // FIXME: note that the following test line has a spurious whitespace. |
| // CHECK-NEXT: case 'int' selected |
| // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:34> 'int' 12 |
| _Generic(i, int : 12, float : 10, default : 100); |
| // CHECK: GenericSelectionExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:50> 'int' |
| // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int' |
| // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int' |
| // FIXME: note that the following test line has a spurious whitespace. |
| // CHECK-NEXT: case 'int' selected |
| // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:21> 'int' 12 |
| // FIXME: note that the following test line has a spurious whitespace. |
| // CHECK-NEXT: case 'float' |
| // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'float' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:33> 'int' 10 |
| // CHECK-NEXT: default |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:47> 'int' 100 |
| |
| int j = _Generic(i, int : 12); |
| // CHECK: DeclStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:32> |
| // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:3, col:31> col:7 j 'int' cinit |
| // CHECK-NEXT: GenericSelectionExpr 0x{{[^ ]*}} <col:11, col:31> 'int' |
| // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:20> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int' |
| // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int' |
| // FIXME: note that the following test line has a spurious whitespace. |
| // CHECK-NEXT: case 'int' selected |
| // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:29> 'int' 12 |
| } |
| |
| void TestLabelsAndGoto(void) { |
| // Note: case and default labels are handled by TestSwitch(). |
| |
| label1: |
| ; |
| // CHECK: LabelStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:1, line:[[@LINE-1]]:3> 'label1' |
| // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <col:3> |
| |
| goto label2; |
| // CHECK-NEXT: GotoStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'label2' 0x{{[^ ]*}} |
| |
| label2: |
| 0; |
| // CHECK-NEXT: LabelStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:1, line:[[@LINE-1]]:3> 'label2' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:3> 'int' 0 |
| |
| void *ptr = &&label1; |
| // CHECK-NEXT: DeclStmt |
| // CHECK-NEXT: VarDecl |
| // CHECK-NEXT: AddrLabelExpr 0x{{[^ ]*}} <col:15, col:17> 'void *' label1 0x{{[^ ]*}} |
| |
| goto *ptr; |
| // CHECK-NEXT: IndirectGotoStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:9> 'void *' lvalue Var 0x{{[^ ]*}} 'ptr' 'void *' |
| } |
| |
| void TestSwitch(int i) { |
| switch (i) { |
| // CHECK: SwitchStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+32]]:3> |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:11> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int' |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:14, line:[[@LINE+29]]:3> |
| case 0: |
| break; |
| // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> |
| // CHECK-NEXT: ConstantExpr |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:8> 'int' 0 |
| // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} <line:[[@LINE-4]]:5> |
| case 1: |
| case 2: |
| break; |
| // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} <line:[[@LINE-3]]:3, line:[[@LINE-1]]:5> |
| // CHECK-NEXT: ConstantExpr |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:8> 'int' 1 |
| // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} <line:[[@LINE-5]]:3, line:[[@LINE-4]]:5> |
| // CHECK-NEXT: ConstantExpr |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:8> 'int' 2 |
| // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} <line:[[@LINE-7]]:5> |
| default: |
| break; |
| // CHECK-NEXT: DefaultStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> |
| // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} <col:5> |
| case 3 ... 5: |
| break; |
| // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> gnu_range |
| // CHECK-NEXT: ConstantExpr |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:8> 'int' 3 |
| // CHECK-NEXT: ConstantExpr |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:14> 'int' 5 |
| // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} <line:[[@LINE-6]]:5> |
| } |
| } |
| |
| void TestIf(_Bool b) { |
| if (b) |
| ; |
| // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: NullStmt |
| |
| if (b) {} |
| // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: CompoundStmt |
| |
| if (b) |
| ; |
| else |
| ; |
| // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-4]]:3, line:[[@LINE-1]]:5> has_else |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-6]]:5> |
| // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-5]]:5> |
| |
| if (b) {} |
| else {} |
| // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:9> has_else |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:10, col:11> |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <line:[[@LINE-5]]:8, col:9> |
| |
| if (b) |
| ; |
| else if (b) |
| ; |
| // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-4]]:3, line:[[@LINE-1]]:5> has_else |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-6]]:5> |
| // CHECK-NEXT: IfStmt 0x{{[^ ]*}} <line:[[@LINE-6]]:8, line:[[@LINE-5]]:5> |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-8]]:5> |
| |
| if (b) |
| ; |
| else if (b) |
| ; |
| else |
| ; |
| // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-6]]:3, line:[[@LINE-1]]:5> has_else |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-8]]:5> |
| // CHECK-NEXT: IfStmt 0x{{[^ ]*}} <line:[[@LINE-8]]:8, line:[[@LINE-5]]:5> has_else |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-10]]:5> |
| // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-9]]:5> |
| } |
| |
| void TestIteration(_Bool b) { |
| while (b) |
| ; |
| // CHECK: WhileStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-4]]:5> |
| |
| do |
| ; |
| while (b); |
| // CHECK: DoStmt 0x{{[^ ]*}} <line:[[@LINE-3]]:3, line:[[@LINE-1]]:11> |
| // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-3]]:5> |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| |
| for (int i = 0; i < 10; ++i) |
| ; |
| // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> |
| // CHECK-NEXT: DeclStmt |
| // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:8, col:16> col:12 used i 'int' cinit |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:16> 'int' 0 |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:19, col:23> 'int' '<' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'int' lvalue Var 0x{{[^ ]*}} 'i' 'int' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:23> 'int' 10 |
| // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:27, col:29> 'int' prefix '++' |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:29> 'int' lvalue Var 0x{{[^ ]*}} 'i' 'int' |
| // CHECK-NEXT: NullStmt |
| |
| for (b; b; b) |
| ; |
| // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:11> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: NullStmt |
| |
| for (; b; b = !b) |
| ; |
| // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:13, col:18> '_Bool' '=' |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:13> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:17, col:18> 'int' prefix '!' cannot overflow |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:18> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: NullStmt |
| |
| for (; b;) |
| ; |
| // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: NullStmt |
| |
| for (;; b = !b) |
| ; |
| // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-6]]:11, col:16> '_Bool' '=' |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:11> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:15, col:16> 'int' prefix '!' cannot overflow |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' |
| // CHECK-NEXT: NullStmt |
| |
| for (;;) |
| ; |
| // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: NullStmt |
| } |
| |
| void TestJumps(void) { |
| // goto and computed goto was tested in TestLabelsAndGoto(). |
| |
| while (1) { |
| continue; |
| // CHECK: ContinueStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:5> |
| break; |
| // CHECK: BreakStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:5> |
| } |
| return; |
| // CHECK: ReturnStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3> |
| |
| return TestSwitch(1); |
| // CHECK: ReturnStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:22> |
| // CHECK-NEXT: CallExpr 0x{{[^ ]*}} <col:10, col:22> 'void' |
| } |
| |
| void TestMiscStmts(void) { |
| ({int a = 10; a;}); |
| // CHECK: StmtExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:20> 'int' |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: DeclStmt |
| // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:5, col:13> col:9 used a 'int' cinit |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:13> 'int' 10 |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:17> 'int' lvalue Var 0x{{[^ ]*}} 'a' 'int' |
| ({int a = 10; a;;; }); |
| // CHECK-NEXT: StmtExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:23> 'int' |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: DeclStmt |
| // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:5, col:13> col:9 used a 'int' cinit |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:13> 'int' 10 |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:17> 'int' lvalue Var 0x{{[^ ]*}} 'a' 'int' |
| // CHECK-NEXT: NullStmt |
| // CHECK-NEXT: NullStmt |
| } |