brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.0 KiB · 060ae3b Raw
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