From 818cb4b9f8e200d8db6f0af903a167f6b545a97f Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Fri, 7 Dec 2018 12:35:15 +0000 Subject: [PATCH] Adding tests for -ast-dump; NFC. This adds tests for various statements in C. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@348588 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/AST/ast-dump-stmt.c | 246 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 241 insertions(+), 5 deletions(-) diff --git a/test/AST/ast-dump-stmt.c b/test/AST/ast-dump-stmt.c index fe90fa6b2e..b27451e2d4 100644 --- a/test/AST/ast-dump-stmt.c +++ b/test/AST/ast-dump-stmt.c @@ -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 i) { // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int' // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 12 } + +void TestLabelsAndGoto(void) { + // Note: case and default labels are handled by TestSwitch(). + +label1: + ; + // CHECK: LabelStmt 0x{{[^ ]*}} 'label1' + // CHECK-NEXT: NullStmt 0x{{[^ ]*}} + + goto label2; + // CHECK-NEXT: GotoStmt 0x{{[^ ]*}} 'label2' 0x{{[^ ]*}} + +label2: + 0; + // CHECK-NEXT: LabelStmt 0x{{[^ ]*}} 'label2' + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 0 + + void *ptr = &&label1; + // CHECK-NEXT: DeclStmt + // CHECK-NEXT: VarDecl + // CHECK-NEXT: AddrLabelExpr 0x{{[^ ]*}} 'void *' label1 0x{{[^ ]*}} + + goto *ptr; + // CHECK-NEXT: IndirectGotoStmt 0x{{[^ ]*}} + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'void *' lvalue Var 0x{{[^ ]*}} 'ptr' 'void *' +} + +void TestSwitch(int i) { + switch (i) { + // CHECK: SwitchStmt 0x{{[^ ]*}} + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int' + // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} + case 0: + break; + // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} + // CHECK-NEXT: ConstantExpr + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 0 + // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} + case 1: + case 2: + break; + // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} + // CHECK-NEXT: ConstantExpr + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 1 + // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} + // CHECK-NEXT: ConstantExpr + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 2 + // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} + default: + break; + // CHECK-NEXT: DefaultStmt 0x{{[^ ]*}} + // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} + case 3 ... 5: + break; + // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} gnu_range + // CHECK-NEXT: ConstantExpr + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 3 + // CHECK-NEXT: ConstantExpr + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 5 + // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} + } +} + +void TestIf(_Bool b) { + if (b) + ; + // CHECK: IfStmt 0x{{[^ ]*}} + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: NullStmt + + if (b) {} + // CHECK: IfStmt 0x{{[^ ]*}} + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: CompoundStmt + + if (b) + ; + else + ; + // CHECK: IfStmt 0x{{[^ ]*}} has_else + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: NullStmt 0x{{[^ ]*}} + // CHECK-NEXT: NullStmt 0x{{[^ ]*}} + + if (b) {} + else {} + // CHECK: IfStmt 0x{{[^ ]*}} has_else + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} + // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} + + if (b) + ; + else if (b) + ; + // CHECK: IfStmt 0x{{[^ ]*}} has_else + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: NullStmt 0x{{[^ ]*}} + // CHECK-NEXT: IfStmt 0x{{[^ ]*}} + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: NullStmt 0x{{[^ ]*}} + + if (b) + ; + else if (b) + ; + else + ; + // CHECK: IfStmt 0x{{[^ ]*}} has_else + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: NullStmt 0x{{[^ ]*}} + // CHECK-NEXT: IfStmt 0x{{[^ ]*}} has_else + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: NullStmt 0x{{[^ ]*}} + // CHECK-NEXT: NullStmt 0x{{[^ ]*}} +} + +void TestIteration(_Bool b) { + while (b) + ; + // CHECK: WhileStmt 0x{{[^ ]*}} + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: NullStmt 0x{{[^ ]*}} + + do + ; + while (b); + // CHECK: DoStmt 0x{{[^ ]*}} + // CHECK-NEXT: NullStmt 0x{{[^ ]*}} + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + + for (int i = 0; i < 10; ++i) + ; + // CHECK: ForStmt 0x{{[^ ]*}} + // CHECK-NEXT: DeclStmt + // CHECK-NEXT: VarDecl 0x{{[^ ]*}} col:12 used i 'int' cinit + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 0 + // CHECK-NEXT: <<>> + // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} 'int' '<' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue Var 0x{{[^ ]*}} 'i' 'int' + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 10 + // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} 'int' prefix '++' + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue Var 0x{{[^ ]*}} 'i' 'int' + // CHECK-NEXT: NullStmt + + for (b; b; b) + ; + // CHECK: ForStmt 0x{{[^ ]*}} + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: <<>> + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: NullStmt + + for (; b; b = !b) + ; + // CHECK: ForStmt 0x{{[^ ]*}} + // CHECK-NEXT: <<>> + // CHECK-NEXT: <<>> + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} '_Bool' '=' + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} 'int' prefix '!' cannot overflow + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: NullStmt + + for (; b;) + ; + // CHECK: ForStmt 0x{{[^ ]*}} + // CHECK-NEXT: <<>> + // CHECK-NEXT: <<>> + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: <<>> + // CHECK-NEXT: NullStmt + + for (;; b = !b) + ; + // CHECK: ForStmt 0x{{[^ ]*}} + // CHECK-NEXT: <<>> + // CHECK-NEXT: <<>> + // CHECK-NEXT: <<>> + // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} '_Bool' '=' + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} 'int' prefix '!' cannot overflow + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool' + // CHECK-NEXT: NullStmt + + for (;;) + ; + // CHECK: ForStmt 0x{{[^ ]*}} + // CHECK-NEXT: <<>> + // CHECK-NEXT: <<>> + // CHECK-NEXT: <<>> + // CHECK-NEXT: <<>> + // CHECK-NEXT: NullStmt +} + +void TestJumps(void) { + // goto and computed goto was tested in TestLabelsAndGoto(). + + while (1) { + continue; + // CHECK: ContinueStmt 0x{{[^ ]*}} + break; + // CHECK: BreakStmt 0x{{[^ ]*}} + } + return; + // CHECK: ReturnStmt 0x{{[^ ]*}} + + return TestSwitch(1); + // CHECK: ReturnStmt 0x{{[^ ]*}} + // CHECK-NEXT: CallExpr 0x{{[^ ]*}} 'void' +} -- 2.40.0