304 lines · cpp
1// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 -frecovery-ast -frecovery-ast-type -ast-dump %s | FileCheck -strict-whitespace %s2// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 -fno-recovery-ast -ast-dump %s | FileCheck --check-prefix=DISABLED -strict-whitespace %s3 4int some_func(int *);5 6// CHECK: VarDecl {{.*}} invalid_call7// CHECK-NEXT: `-RecoveryExpr {{.*}} 'int' contains-errors8// CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} 'some_func'9// CHECK-NEXT: `-IntegerLiteral {{.*}} 12310// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors11int invalid_call = some_func(123);12 13int some_func2(int a, int b);14void test_invalid_call_2() {15 // CHECK: -RecoveryExpr {{.*}} '<dependent type>' contains-errors16 // CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} '<overloaded function type>' lvalue (ADL) = 'some_func2'17 some_func2(,);18 19 // CHECK: -RecoveryExpr {{.*}} '<dependent type>' contains-errors20 // CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} '<overloaded function type>' lvalue (ADL) = 'some_func2'21 some_func2(,,);22 23 // CHECK: -RecoveryExpr {{.*}} '<dependent type>' contains-errors24 // CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} '<overloaded function type>' lvalue (ADL) = 'some_func2'25 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 126 some_func2(1,);27 28 // CHECK: -RecoveryExpr {{.*}} '<dependent type>' contains-errors29 // CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} '<overloaded function type>' lvalue (ADL) = 'some_func2'30 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 131 some_func2(,1);32}33 34int ambig_func(double);35int ambig_func(float);36 37// CHECK: VarDecl {{.*}} ambig_call38// CHECK-NEXT: `-RecoveryExpr {{.*}} 'int' contains-errors39// CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} 'ambig_func'40// CHECK-NEXT: `-IntegerLiteral {{.*}} 12341// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors42int ambig_call = ambig_func(123);43 44constexpr int a = 10;45 46// CHECK: VarDecl {{.*}} postfix_inc47// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors48// CHECK-NEXT: `-DeclRefExpr {{.*}} 'a'49// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors50int postfix_inc = a++;51 52// CHECK: VarDecl {{.*}} prefix_inc53// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors54// CHECK-NEXT: `-DeclRefExpr {{.*}} 'a'55// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors56int prefix_inc = ++a;57 58// CHECK: VarDecl {{.*}} unary_address59// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors60// CHECK-NEXT: `-ParenExpr {{.*}}61// CHECK-NEXT: `-BinaryOperator {{.*}} '+'62// CHECK-NEXT: |-ImplicitCastExpr63// CHECK-NEXT: | `-DeclRefExpr {{.*}} 'a'64// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors65int unary_address = &(a + 1);66 67// CHECK: VarDecl {{.*}} unary_bitinverse68// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors69// CHECK-NEXT: `-ParenExpr {{.*}}70// CHECK-NEXT: `-BinaryOperator {{.*}} '+'71// CHECK-NEXT: |-ImplicitCastExpr72// CHECK-NEXT: | `-ImplicitCastExpr73// CHECK-NEXT: | `-DeclRefExpr {{.*}} 'a'74// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors75int unary_bitinverse = ~(a + 0.0);76 77// CHECK: VarDecl {{.*}} binary78// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors79// CHECK-NEXT: |-DeclRefExpr {{.*}} 'a'80// CHECK-NEXT: `-CXXNullPtrLiteralExpr81// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors82int binary = a + nullptr;83 84// CHECK: VarDecl {{.*}} ternary85// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors86// CHECK-NEXT: |-DeclRefExpr {{.*}} 'a'87// CHECK-NEXT: |-CXXNullPtrLiteralExpr88// CHECK-NEXT: `-DeclRefExpr {{.*}} 'a'89// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors90int ternary = a ? nullptr : a;91 92// CHECK: FunctionDecl93// CHECK-NEXT:|-ParmVarDecl {{.*}} x94// CHECK-NEXT:`-CompoundStmt95// CHECK-NEXT: |-RecoveryExpr {{.*}} contains-errors96// CHECK-NEXT: | `-DeclRefExpr {{.*}} 'foo'97// CHECK-NEXT: `-CallExpr {{.*}} contains-errors98// CHECK-NEXT: |-RecoveryExpr {{.*}} contains-errors99// CHECK-NEXT: | `-DeclRefExpr {{.*}} 'foo'100// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x'101struct Foo {} foo;102void test(int x) {103 foo.abc;104 foo->func(x);105}106 107void AccessIncompleteClass() {108 struct Forward;109 Forward* ptr;110 // CHECK: CallExpr {{.*}} '<dependent type>'111 // CHECK-NEXT: `-CXXDependentScopeMemberExpr {{.*}} '<dependent type>'112 // CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>' contains-errors113 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'Forward *'114 ptr->method();115}116 117struct Foo2 {118 double func();119 class ForwardClass;120 ForwardClass createFwd();121 122 int overload();123 int overload(int, int);124};125void test2(Foo2 f) {126 // CHECK: RecoveryExpr {{.*}} 'double'127 // CHECK-NEXT: |-MemberExpr {{.*}} '<bound member function type>'128 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'f'129 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1130 f.func(1);131 // CHECK: RecoveryExpr {{.*}} 'ForwardClass'132 // CHECK-NEXT: `-MemberExpr {{.*}} '<bound member function type>' .createFwd133 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'f'134 f.createFwd();135 // CHECK: RecoveryExpr {{.*}} 'int' contains-errors136 // CHECK-NEXT: |-UnresolvedMemberExpr137 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'Foo2'138 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1139 f.overload(1);140}141 142auto f();143int f(double);144// CHECK: VarDecl {{.*}} unknown_type_call 'int'145// CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>'146int unknown_type_call = f(0, 0);147 148void InvalidInitalizer(int x) {149 struct Bar { Bar(); };150 // CHECK: `-VarDecl {{.*}} a1 'Bar'151 // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors152 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1153 Bar a1(1);154 // CHECK: `-VarDecl {{.*}} a2 'Bar'155 // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors156 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'x'157 Bar a2(x);158 // CHECK: `-VarDecl {{.*}} a3 'Bar'159 // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors160 // CHECK-NEXT: `-InitListExpr161 // CHECK-NEDT: `-DeclRefExpr {{.*}} 'x'162 Bar a3{x};163 164 // CHECK: `-VarDecl {{.*}} b1 'Bar'165 // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors166 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1167 Bar b1 = 1;168 // CHECK: `-VarDecl {{.*}} b2 'Bar'169 // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors170 // CHECK-NEXT: `-InitListExpr171 Bar b2 = {1};172 // CHECK: `-VarDecl {{.*}} b3 'Bar'173 // CHECK-NEXT: `-RecoveryExpr {{.*}} 'Bar' contains-errors174 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'175 Bar b3 = Bar(x);176 // CHECK: `-VarDecl {{.*}} b4 'Bar'177 // CHECK-NEXT: `-RecoveryExpr {{.*}} 'Bar' contains-errors178 // CHECK-NEXT: `-InitListExpr {{.*}} 'void'179 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'180 Bar b4 = Bar{x};181 182 // CHECK: RecoveryExpr {{.*}} 'Bar' contains-errors183 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1184 Bar(1);185}186 187// CHECK: VarDecl {{.*}} NoCrashOnInvalidInitList188// CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>' contains-errors lvalue189// CHECK-NEXT: `-InitListExpr190// CHECK-NEXT: `-DesignatedInitExpr {{.*}} 'void'191// CHECK-NEXT: `-CXXNullPtrLiteralExpr {{.*}} 'std::nullptr_t'192struct {193 int& abc;194} NoCrashOnInvalidInitList = {195 .abc = nullptr,196};197 198// Verify the value category of recovery expression.199int prvalue(int);200int &lvalue(int);201int &&xvalue(int);202void ValueCategory() {203 // CHECK: RecoveryExpr {{.*}} 'int' contains-errors204 prvalue(); // call to a function (nonreference return type) yields a prvalue (not print by default)205 // CHECK: RecoveryExpr {{.*}} 'int' contains-errors lvalue206 lvalue(); // call to a function (lvalue reference return type) yields an lvalue.207 // CHECK: RecoveryExpr {{.*}} 'int' contains-errors xvalue208 xvalue(); // call to a function (rvalue reference return type) yields an xvalue.209}210 211void CtorInitializer() {212 struct S{int m};213 class BaseInit : S {214 BaseInit(float) : S("no match") {}215 // CHECK: CXXConstructorDecl {{.*}} BaseInit 'void (float)'216 // CHECK-NEXT: |-ParmVarDecl217 // CHECK-NEXT: |-CXXCtorInitializer 'S'218 // CHECK-NEXT: | `-RecoveryExpr {{.*}} 'S'219 // CHECK-NEXT: | `-StringLiteral220 };221 class DelegatingInit {222 DelegatingInit(float) : DelegatingInit("no match") {}223 // CHECK: CXXConstructorDecl {{.*}} DelegatingInit 'void (float)'224 // CHECK-NEXT: |-ParmVarDecl225 // CHECK-NEXT: |-CXXCtorInitializer 'DelegatingInit'226 // CHECK-NEXT: | `-RecoveryExpr {{.*}} 'DelegatingInit'227 // CHECK-NEXT: | `-StringLiteral228 };229}230 231float *brokenReturn() {232 // CHECK: FunctionDecl {{.*}} brokenReturn233 return 42;234 // CHECK: ReturnStmt235 // CHECK-NEXT: `-RecoveryExpr {{.*}} 'float *'236 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 42237}238 239// Return deduction treats the first, second *and* third differently!240auto *brokenDeducedReturn(int *x, float *y, double *z) {241 // CHECK: FunctionDecl {{.*}} invalid brokenDeducedReturn242 if (x) return x;243 // CHECK: ReturnStmt244 // CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>245 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int *'246 if (y) return y;247 // CHECK: ReturnStmt248 // CHECK-NEXT: `-RecoveryExpr {{.*}} 'int *'249 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'y' 'float *'250 if (z) return z;251 // CHECK: ReturnStmt252 // CHECK-NEXT: `-RecoveryExpr {{.*}} 'int *'253 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'z' 'double *'254 return x;255 // Unfortunate: we wrap a valid return in RecoveryExpr.256 // This is to avoid running deduction again after it failed once.257 // CHECK: ReturnStmt258 // CHECK-NEXT: `-RecoveryExpr {{.*}} 'int *'259 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int *'260}261 262void returnInitListFromVoid() {263 // CHECK: FunctionDecl {{.*}} returnInitListFromVoid264 return {7,8};265 // CHECK: ReturnStmt266 // CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>'267 // CHECK-NEXT: |-IntegerLiteral {{.*}} 'int' 7268 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 8269}270 271// Fix crash issue https://github.com/llvm/llvm-project/issues/112560.272// Make sure clang compiles the following code without crashing:273 274// CHECK:NamespaceDecl {{.*}} GH112560275// CHECK-NEXT: |-CXXRecordDecl {{.*}} referenced union U definition276// CHECK-NEXT: | |-DefinitionData {{.*}}277// CHECK-NEXT: | | |-DefaultConstructor {{.*}}278// CHECK-NEXT: | | |-CopyConstructor {{.*}}279// CHECK-NEXT: | | |-MoveConstructor {{.*}}280// CHECK-NEXT: | | |-CopyAssignment {{.*}}281// CHECK-NEXT: | | |-MoveAssignment {{.*}}282// CHECK-NEXT: | | `-Destructor {{.*}}283// CHECK-NEXT: | |-CXXRecordDecl {{.*}} implicit union U284// CHECK-NEXT: | `-FieldDecl {{.*}} invalid f 'int'285// CHECK-NEXT: | `-RecoveryExpr {{.*}} 'int' contains-errors286// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors287namespace GH112560 {288union U {289 int f = ;290};291 292// CHECK: FunctionDecl {{.*}} foo 'void ()'293// CHECK-NEXT: `-CompoundStmt {{.*}}294// CHECK-NEXT: `-DeclStmt {{.*}}295// CHECK-NEXT: `-VarDecl {{.*}} g 'U' listinit296// CHECK-NEXT: `-InitListExpr {{.*}} 'U' contains-errors field Field {{.*}} 'f' 'int'297// CHECK-NEXT: `-CXXDefaultInitExpr {{.*}} 'int' contains-errors has rewritten init298// CHECK-NEXT: `-RecoveryExpr {{.*}} 'int' contains-errors299// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors300void foo() {301 U g{};302}303} // namespace GH112560304