forked from OSchip/llvm-project
214 lines
8.4 KiB
C++
214 lines
8.4 KiB
C++
// 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 %s
|
|
// 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 %s
|
|
|
|
int some_func(int *);
|
|
|
|
// CHECK: VarDecl {{.*}} invalid_call
|
|
// CHECK-NEXT: `-ImplicitCastExpr {{.*}} 'int' contains-errors
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} 'int' contains-errors
|
|
// CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} 'some_func'
|
|
// CHECK-NEXT: `-IntegerLiteral {{.*}} 123
|
|
// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors
|
|
int invalid_call = some_func(123);
|
|
void test_invalid_call(int s) {
|
|
// CHECK: CallExpr {{.*}} '<dependent type>' contains-errors
|
|
// CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} 'some_func'
|
|
// CHECK-NEXT: |-RecoveryExpr {{.*}} <col:13>
|
|
// CHECK-NEXT: `-BinaryOperator {{.*}}
|
|
// CHECK-NEXT: |-RecoveryExpr {{.*}}
|
|
// CHECK-NEXT: `-IntegerLiteral {{.*}} <col:28> 'int' 1
|
|
some_func(undef1, undef2+1);
|
|
|
|
// CHECK: BinaryOperator {{.*}} '<dependent type>' contains-errors '='
|
|
// CHECK-NEXT: |-DeclRefExpr {{.*}} 's'
|
|
// CHECK-NEXT: `-CallExpr {{.*}} '<dependent type>' contains-errors
|
|
// CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} 'some_func'
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors
|
|
s = some_func(undef1);
|
|
// CHECK: `-VarDecl {{.*}} invalid var 'int'
|
|
// FIXME: preserve the broken call.
|
|
int var = some_func(undef1);
|
|
}
|
|
|
|
int ambig_func(double);
|
|
int ambig_func(float);
|
|
|
|
// CHECK: VarDecl {{.*}} ambig_call
|
|
// CHECK-NEXT: `-ImplicitCastExpr {{.*}} 'int' contains-errors
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} 'int' contains-errors
|
|
// CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} 'ambig_func'
|
|
// CHECK-NEXT: `-IntegerLiteral {{.*}} 123
|
|
// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors
|
|
int ambig_call = ambig_func(123);
|
|
|
|
// CHECK: VarDecl {{.*}} unresolved_call1
|
|
// CHECK-NEXT:`-RecoveryExpr {{.*}} '<dependent type>' contains-errors
|
|
// CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} 'bar'
|
|
// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors
|
|
int unresolved_call1 = bar();
|
|
|
|
// CHECK: VarDecl {{.*}} unresolved_call2
|
|
// CHECK-NEXT:`-CallExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} 'bar'
|
|
// CHECK-NEXT: |-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: | `-UnresolvedLookupExpr {{.*}} 'baz'
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} 'qux'
|
|
// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors
|
|
int unresolved_call2 = bar(baz(), qux());
|
|
|
|
constexpr int a = 10;
|
|
|
|
// CHECK: VarDecl {{.*}} postfix_inc
|
|
// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'a'
|
|
// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors
|
|
int postfix_inc = a++;
|
|
|
|
// CHECK: VarDecl {{.*}} prefix_inc
|
|
// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'a'
|
|
// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors
|
|
int prefix_inc = ++a;
|
|
|
|
// CHECK: VarDecl {{.*}} unary_address
|
|
// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-ParenExpr {{.*}}
|
|
// CHECK-NEXT: `-BinaryOperator {{.*}} '+'
|
|
// CHECK-NEXT: |-ImplicitCastExpr
|
|
// CHECK-NEXT: | `-DeclRefExpr {{.*}} 'a'
|
|
// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors
|
|
int unary_address = &(a + 1);
|
|
|
|
// CHECK: VarDecl {{.*}} unary_bitinverse
|
|
// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-ParenExpr {{.*}}
|
|
// CHECK-NEXT: `-BinaryOperator {{.*}} '+'
|
|
// CHECK-NEXT: |-ImplicitCastExpr
|
|
// CHECK-NEXT: | `-ImplicitCastExpr
|
|
// CHECK-NEXT: | `-DeclRefExpr {{.*}} 'a'
|
|
// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors
|
|
int unary_bitinverse = ~(a + 0.0);
|
|
|
|
// CHECK: VarDecl {{.*}} binary
|
|
// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: |-DeclRefExpr {{.*}} 'a'
|
|
// CHECK-NEXT: `-CXXNullPtrLiteralExpr
|
|
// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors
|
|
int binary = a + nullptr;
|
|
|
|
// CHECK: VarDecl {{.*}} ternary
|
|
// CHECK-NEXT:`-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: |-DeclRefExpr {{.*}} 'a'
|
|
// CHECK-NEXT: |-CXXNullPtrLiteralExpr
|
|
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'a'
|
|
// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors
|
|
int ternary = a ? nullptr : a;
|
|
|
|
// CHECK: FunctionDecl
|
|
// CHECK-NEXT:|-ParmVarDecl {{.*}} x
|
|
// CHECK-NEXT:`-CompoundStmt
|
|
// CHECK-NEXT: |-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: | `-DeclRefExpr {{.*}} 'foo'
|
|
// CHECK-NEXT: `-CallExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: |-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: | `-DeclRefExpr {{.*}} 'foo'
|
|
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x'
|
|
struct Foo {} foo;
|
|
void test(int x) {
|
|
foo.abc;
|
|
foo->func(x);
|
|
}
|
|
|
|
// CHECK: |-AlignedAttr {{.*}} alignas
|
|
// CHECK-NEXT:| `-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT:| `-UnresolvedLookupExpr {{.*}} 'invalid'
|
|
struct alignas(invalid()) Aligned {};
|
|
|
|
void InvalidInitalizer(int x) {
|
|
struct Bar { Bar(); };
|
|
// CHECK: `-VarDecl {{.*}} a1 'Bar'
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1
|
|
Bar a1(1);
|
|
// CHECK: `-VarDecl {{.*}} a2 'Bar'
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x'
|
|
Bar a2(x);
|
|
// CHECK: `-VarDecl {{.*}} a3 'Bar'
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-InitListExpr
|
|
// CHECK-NEDT: `-DeclRefExpr {{.*}} 'x'
|
|
Bar a3{x};
|
|
// CHECK: `-VarDecl {{.*}} a4 'Bar'
|
|
// CHECK-NEXT: `-ParenListExpr {{.*}} 'NULL TYPE' contains-errors
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} 'invalid'
|
|
Bar a4(invalid());
|
|
// CHECK: `-VarDecl {{.*}} a5 'Bar'
|
|
// CHECK-NEXT: `-InitListExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} 'invalid'
|
|
Bar a5{invalid()};
|
|
|
|
// CHECK: `-VarDecl {{.*}} b1 'Bar'
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1
|
|
Bar b1 = 1;
|
|
// CHECK: `-VarDecl {{.*}} b2 'Bar'
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-InitListExpr
|
|
Bar b2 = {1};
|
|
// FIXME: preserve the invalid initializer.
|
|
// CHECK: `-VarDecl {{.*}} b3 'Bar'
|
|
Bar b3 = Bar(x);
|
|
// FIXME: preserve the invalid initializer.
|
|
// CHECK: `-VarDecl {{.*}} b4 'Bar'
|
|
Bar b4 = Bar{x};
|
|
// CHECK: `-VarDecl {{.*}} b5 'Bar'
|
|
// CHECK-NEXT: `-CXXUnresolvedConstructExpr {{.*}} 'Bar' contains-errors 'Bar'
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} 'invalid'
|
|
Bar b5 = Bar(invalid());
|
|
// CHECK: `-VarDecl {{.*}} b6 'Bar'
|
|
// CHECK-NEXT: `-CXXUnresolvedConstructExpr {{.*}} 'Bar' contains-errors 'Bar'
|
|
// CHECK-NEXT: `-InitListExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors
|
|
// CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} 'invalid'
|
|
Bar b6 = Bar{invalid()};
|
|
}
|
|
void InitializerForAuto() {
|
|
// CHECK: `-VarDecl {{.*}} invalid a 'auto'
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>' contains-errors
|
|
// CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} 'invalid'
|
|
auto a = invalid();
|
|
|
|
// CHECK: `-VarDecl {{.*}} invalid b 'auto'
|
|
// CHECK-NEXT: `-CallExpr {{.*}} '<dependent type>' contains-errors
|
|
// CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} 'some_func'
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>' contains-errors
|
|
// CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} 'invalid'
|
|
auto b = some_func(invalid());
|
|
|
|
decltype(ned);
|
|
// very bad initailizer: there is an unresolved typo expr internally, we just
|
|
// drop it.
|
|
// CHECK: `-VarDecl {{.*}} invalid unresolved_typo 'auto'
|
|
auto unresolved_typo = gned.*[] {};
|
|
}
|
|
|
|
// Verified that the generated call operator is invalid.
|
|
// CHECK: |-CXXMethodDecl {{.*}} invalid operator() 'auto () const -> auto'
|
|
using Escape = decltype([] { return undef(); }());
|
|
|
|
// CHECK: VarDecl {{.*}} NoCrashOnInvalidInitList
|
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>' contains-errors lvalue
|
|
// CHECK-NEXT: `-InitListExpr
|
|
// CHECK-NEXT: `-DesignatedInitExpr {{.*}} 'void'
|
|
// CHECK-NEXT: `-CXXNullPtrLiteralExpr {{.*}} 'nullptr_t'
|
|
struct {
|
|
int& abc;
|
|
} NoCrashOnInvalidInitList = {
|
|
.abc = nullptr,
|
|
};
|