From: Aaron Ballman Date: Mon, 10 Dec 2018 18:37:47 +0000 (+0000) Subject: Adding tests for -ast-dump; NFC. X-Git-Tag: llvmorg-8.0.0-rc1~2446 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2ead087b6dc798da8cfa30cb116c8cda892a2b6a;p=platform%2Fupstream%2Fllvm.git Adding tests for -ast-dump; NFC. This adds tests for expressions in C. llvm-svn: 348786 --- diff --git a/clang/test/AST/ast-dump-expr.c b/clang/test/AST/ast-dump-expr.c new file mode 100644 index 0000000..645d403 --- /dev/null +++ b/clang/test/AST/ast-dump-expr.c @@ -0,0 +1,339 @@ +// RUN: %clang_cc1 -Wno-unused-value -std=gnu11 -ast-dump %s | FileCheck -strict-whitespace %s + +void Comma(void) { + 1, 2, 3; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' ',' + // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} 'int' ',' + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 1 + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 2 + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 3 +} + +void Assignment(int a) { + a = 12; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '=' + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 12 + + a += a; + // CHECK: CompoundAssignOperator 0x{{[^ ]*}} 'int' '+=' ComputeLHSTy='int' ComputeResultTy='int' + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' +} + +void Conditionals(int a) { + a ? 0 : 1; + // CHECK: ConditionalOperator 0x{{[^ ]*}} 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 0 + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 1 + + a ?: 0; + // CHECK: BinaryConditionalOperator 0x{{[^ ]*}} 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: OpaqueValueExpr 0x{{[^ ]*}} 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: OpaqueValueExpr 0x{{[^ ]*}} 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 0 +} + +void BinaryOperators(int a, int b) { + // Logical operators + a || b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '||' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + a && b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '&&' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + // Bitwise operators + a | b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '|' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + a ^ b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '^' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + a & b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '&' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + // Equality operators + a == b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '==' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + a != b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '!=' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + // Relational operators + a < b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '<' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + a > b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '>' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + a <= b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '<=' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + a >= b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '>=' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + // Bit shifting operators + a << b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '<<' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + a >> b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '>>' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + // Additive operators + a + b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '+' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + a - b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '-' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + // Multiplicative operators + a * b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '*' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + a / b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '/' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' + + a % b; + // CHECK: BinaryOperator 0x{{[^ ]*}} 'int' '%' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int' +} + +void UnaryOperators(int a, int *b) { + // Cast operators + (float)a; + // CHECK: CStyleCastExpr 0x{{[^ ]*}} 'float' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + + // ++, --, and ~ are covered elsewhere. + + -a; + // CHECK: UnaryOperator 0x{{[^ ]*}} 'int' prefix '-' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + + +a; + // CHECK: UnaryOperator 0x{{[^ ]*}} 'int' prefix '+' cannot overflow + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + + &a; + // CHECK: UnaryOperator 0x{{[^ ]*}} 'int *' prefix '&' cannot overflow + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + + *b; + // CHECK: ImplicitCastExpr + // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} 'int' lvalue prefix '*' cannot overflow + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int *' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int *' + + !a; + // CHECK: UnaryOperator 0x{{[^ ]*}} 'int' prefix '!' cannot overflow + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + + sizeof a; + // CHECK: UnaryExprOrTypeTraitExpr 0x{{[^ ]*}} 'unsigned long long' sizeof + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + + sizeof(int); + // CHECK: UnaryExprOrTypeTraitExpr 0x{{[^ ]*}} 'unsigned long long' sizeof 'int' + + _Alignof(int); + // FIXME: Uses C++ spelling for alignof in C mode. + // CHECK: UnaryExprOrTypeTraitExpr 0x{{[^ ]*}} 'unsigned long long' alignof 'int' +} + +struct S { + int a; +}; + +void PostfixOperators(int *a, struct S b, struct S *c) { + a[0]; + // CHECK: ImplicitCastExpr + // CHECK-NEXT: ArraySubscriptExpr 0x{{[^ ]*}} 'int' lvalue + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int *' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int *' + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 0 + + UnaryOperators(*a, a); + // CHECK: CallExpr 0x{{[^ ]*}} 'void' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'void (int, int *)' Function 0x{{[^ ]*}} 'UnaryOperators' 'void (int, int *)' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} 'int' lvalue prefix '*' cannot overflow + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int *' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int *' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int *' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int *' + + b.a; + // CHECK: ImplicitCastExpr + // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} 'int' lvalue .a 0x{{[^ ]*}} + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'struct S':'struct S' lvalue ParmVar 0x{{[^ ]*}} 'b' 'struct S':'struct S' + + c->a; + // CHECK: ImplicitCastExpr + // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} 'int' lvalue ->a 0x{{[^ ]*}} + // CHECK: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'struct S *' lvalue ParmVar 0x{{[^ ]*}} 'c' 'struct S *' + + // Postfix ++ and -- are covered elsewhere. + + (int [4]){1, 2, 3, 4, }; + // CHECK: ImplicitCastExpr + // CHECK-NEXT: CompoundLiteralExpr 0x{{[^ ]*}} 'int [4]' lvalue + // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} 'int [4]' + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 1 + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 2 + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 3 + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 4 + + (struct S){1}; + // CHECK: ImplicitCastExpr + // CHECK-NEXT: CompoundLiteralExpr 0x{{[^ ]*}} 'struct S':'struct S' lvalue + // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} 'struct S':'struct S' + // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} 'int' 1 +} + +enum E { One }; + +void PrimaryExpressions(int a) { + a; + // CHECK: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + + 'a'; + // CHECK: CharacterLiteral 0x{{[^ ]*}} 'int' 97 + + L'a'; + // CHECK: CharacterLiteral 0x{{[^ ]*}} 'unsigned short' 97 + + "a"; + // ImplicitCastExpr + // CHECK: StringLiteral 0x{{[^ ]*}} 'char [2]' lvalue "a" + + L"a"; + // ImplicitCastExpr + // CHECK: StringLiteral 0x{{[^ ]*}} 'unsigned short [2]' lvalue L"a" + + u8"a"; + // ImplicitCastExpr + // CHECK: StringLiteral 0x{{[^ ]*}} 'char [2]' lvalue u8"a" + + U"a"; + // ImplicitCastExpr + // CHECK: StringLiteral 0x{{[^ ]*}} 'unsigned int [2]' lvalue U"a" + + u"a"; + // ImplicitCastExpr + // CHECK: StringLiteral 0x{{[^ ]*}} 'unsigned short [2]' lvalue u"a" + + 1; + // CHECK: IntegerLiteral 0x{{[^ ]*}} 'int' 1 + + 1u; + // CHECK: IntegerLiteral 0x{{[^ ]*}} 'unsigned int' 1 + + 1ll; + // CHECK: IntegerLiteral 0x{{[^ ]*}} 'long long' 1 + + 1.0; + // CHECK: FloatingLiteral 0x{{[^ ]*}} 'double' {{1\.[0]*e[\+]?[0]+}} + + 1.0f; + // CHECK: FloatingLiteral 0x{{[^ ]*}} 'float' {{1\.[0]*e[\+]?[0]+}} + + 1.0l; + // CHECK: FloatingLiteral 0x{{[^ ]*}} 'long double' {{1\.[0]*e[\+]?[0]+}} + + One; + // CHECK: DeclRefExpr 0x{{[^ ]*}} 'int' EnumConstant 0x{{[^ ]*}} 'One' 'int' + + (a); + // CHECK: ImplicitCastExpr + // CHECK-NEXT: ParenExpr 0x{{[^ ]*}} 'int' lvalue + // CHECK: DeclRefExpr 0x{{[^ ]*}} 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int' + + // Generic selection expressions are covered elsewhere. +}