Author: aaronballman Date: Fri Dec 7 04:35:15 2018 New Revision: 348588 URL: http://llvm.org/viewvc/llvm-project?rev=348588&view=rev Log: Adding tests for -ast-dump; NFC.
This adds tests for various statements in C. Modified: cfe/trunk/test/AST/ast-dump-stmt.c Modified: cfe/trunk/test/AST/ast-dump-stmt.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/AST/ast-dump-stmt.c?rev=348588&r1=348587&r2=348588&view=diff ============================================================================== --- cfe/trunk/test/AST/ast-dump-stmt.c (original) +++ cfe/trunk/test/AST/ast-dump-stmt.c Fri Dec 7 04:35:15 2018 @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c11 -ast-dump -ast-dump-filter Test %s | FileCheck -strict-whitespace %s +// RUN: %clang_cc1 -std=gnu11 -ast-dump %s | FileCheck -strict-whitespace %s int TestLocation = 0; // CHECK: VarDecl{{.*}}TestLocation @@ -6,10 +6,10 @@ int TestLocation = 0; int TestIndent = 1 + (1); // CHECK: VarDecl{{.*}}TestIndent -// CHECK-NEXT: {{^}}`-BinaryOperator{{[^()]*$}} -// CHECK-NEXT: {{^}} |-IntegerLiteral{{.*0[^()]*$}} -// CHECK-NEXT: {{^}} `-ParenExpr{{.*0[^()]*$}} -// CHECK-NEXT: {{^}} `-IntegerLiteral{{.*0[^()]*$}} +// CHECK-NEXT: {{^}}| `-BinaryOperator{{[^()]*$}} +// CHECK-NEXT: {{^}}| |-IntegerLiteral{{.*0[^()]*$}} +// CHECK-NEXT: {{^}}| `-ParenExpr{{.*0[^()]*$}} +// CHECK-NEXT: {{^}}| `-IntegerLiteral{{.*0[^()]*$}} void TestDeclStmt() { int x = 0; @@ -126,3 +126,239 @@ void TestGenericSelectionExpressions(int // 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' +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits