121 lines · c
1// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -frecovery-ast -fno-recovery-ast-type -ast-dump %s | FileCheck -strict-whitespace %s2 3int some_func(int);4 5// CHECK: VarDecl {{.*}} unmatch_arg_call 'int' cinit6// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors7// CHECK-NEXT: `-DeclRefExpr {{.*}} 'some_func'8int unmatch_arg_call = some_func();9 10const int a = 1;11 12// CHECK: VarDecl {{.*}} postfix_inc13// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors14// CHECK-NEXT: `-DeclRefExpr {{.*}} 'a'15int postfix_inc = a++;16 17// CHECK: VarDecl {{.*}} unary_address18// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors19// CHECK-NEXT: `-ParenExpr {{.*}}20// CHECK-NEXT: `-BinaryOperator {{.*}} '+'21// CHECK-NEXT: |-ImplicitCastExpr22// CHECK-NEXT: | `-DeclRefExpr {{.*}} 'a'23// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int'24int unary_address = &(a + 1);25 26void test1() {27 // CHECK: `-RecoveryExpr {{.*}} contains-errors28 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'a' 'const int'29 static int foo = a++; // verify no crash on local static var decl.30}31 32void test2() {33 int* ptr;34 // CHECK: BinaryOperator {{.*}} 'int *' contains-errors '='35 // CHECK-NEXT: |-DeclRefExpr {{.*}} 'ptr' 'int *'36 // CHECK-NEXT: `-RecoveryExpr {{.*}}37 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'some_func'38 ptr = some_func(); // should not crash39 40 int compoundOp;41 // CHECK: CompoundAssignOperator {{.*}} 'int' contains-errors '+='42 // CHECK-NEXT: |-DeclRefExpr {{.*}} 'compoundOp'43 // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors44 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'some_func'45 compoundOp += some_func();46 47 // CHECK: BinaryOperator {{.*}} 'int' contains-errors '||'48 // CHECK-NEXT: |-RecoveryExpr {{.*}}49 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'some_func'50 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 151 some_func() || 1;52 53 // CHECK: BinaryOperator {{.*}} '<dependent type>' contains-errors ','54 // CHECK-NEXT: |-IntegerLiteral {{.*}} 'int' 155 // CHECK-NEXT: `-RecoveryExpr {{.*}}56 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'some_func'57 1, some_func();58 // CHECK: BinaryOperator {{.*}} 'int' contains-errors ','59 // CHECK-NEXT: |-RecoveryExpr {{.*}} '<dependent type>'60 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'some_func'61 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 162 some_func(), 1;63 64 // conditional operator (comparison is invalid)65 float f;66 // CHECK: ConditionalOperator {{.*}} '<dependent type>' contains-errors67 // CHECK-NEXT: |-RecoveryExpr {{.*}} '<dependent type>'68 // CHECK-NEXT: | |-DeclRefExpr {{.*}} 'int *' lvalue69 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'float' lvalue70 // CHECK-NEXT: |-DeclRefExpr {{.*}} 'int *' lvalue71 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'float' lvalue72 (ptr > f ? ptr : f);73 74 // CHECK: CStyleCastExpr {{.*}} 'float' contains-errors <Dependent>75 // CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>'76 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'some_func'77 (float)some_func();78}79 80void test3() {81 // CHECK: CallExpr {{.*}} '<dependent type>' contains-errors82 // CHECK-NEXT: |-ParenExpr {{.*}} contains-errors lvalue83 // CHECK-NEXT: | `-RecoveryExpr {{.*}} contains-errors84 // CHECK-NEXT: | `-DeclRefExpr {{.*}} '__builtin_classify_type'85 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 186 (*__builtin_classify_type)(1);87}88 89// Verify no crash.90void test4() {91 enum GH62446 {92 // CHECK: RecoveryExpr {{.*}} '<dependent type>' contains-errors lvalue93 // CHECK-NEXT: |-StringLiteral {{.*}} "a"94 // CHECK-NEXT: `-IntegerLiteral {{.*}} 295 invalid_enum_value = "a" * 2,96 b,97 };98}99 100// No crash on DeclRefExpr that refers to ValueDecl with invalid initializers.101void test7() {102 int b[] = {""()};103 104 // CHECK: CStyleCastExpr {{.*}} 'unsigned int' contains-errors105 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'int[]' contains-errors106 (unsigned) b; // GH50236107 108 // CHECK: BinaryOperator {{.*}} '<dependent type>' contains-errors '+'109 // CHECK-NEXT: |-DeclRefExpr {{.*}} 'int[]' contains-errors110 // CHECK-NEXT: `-IntegerLiteral {{.*}}111 b + 1; // GH50243112 113 // CHECK: CallExpr {{.*}} '<dependent type>' contains-errors114 // CHECK-NEXT: |-DeclRefExpr {{.*}} 'int ()' Function115 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'int[]' contains-errors116 return c(b); // GH48636117}118int test8_GH50320_b[] = {""()};119// CHECK: ArraySubscriptExpr {{.*}} 'int' contains-errors lvalue120int test8 = test_8GH50320_b[0];121