// RUN: %clang_cc1 -ast-dump %s 2>&1 | FileCheck %s | |
// CHECK-LABEL: example0 | |
void example0() { | |
double d = 2.0; | |
// CHECK: VarDecl{{.*}}rd 'double &' | |
// CHECK-NEXT: DeclRefExpr | |
double &rd = d; | |
// CHECK: VarDecl{{.*}}rcd 'const double &' | |
// CHECK-NEXT: ImplicitCastExpr{{.*}}'const double' lvalue <NoOp> | |
const double &rcd = d; | |
} | |
struct A { }; | |
struct B : A { } b; | |
// CHECK-LABEL: example1 | |
void example1() { | |
// CHECK: VarDecl{{.*}}ra 'A &' | |
// CHECK: ImplicitCastExpr{{.*}}'A' lvalue <DerivedToBase (A)> | |
A &ra = b; | |
// CHECK: VarDecl{{.*}}rca 'const A &' | |
// CHECK: ImplicitCastExpr{{.*}}'const A' lvalue <DerivedToBase (A)> | |
// CHECK-NOT: MaterializeTemporaryExpr | |
// CHECK: ImplicitCastExpr{{.*}}'const B' lvalue <NoOp> | |
const A& rca = b; | |
} | |
extern B f(); | |
struct X { | |
operator B(); | |
} x; | |
// CHECK-LABEL: example2 | |
void example2() { | |
// CHECK: VarDecl{{.*}}rca 'const A &' | |
// CHECK: ImplicitCastExpr{{.*}}'const A' lvalue <DerivedToBase (A)> | |
// CHECK: MaterializeTemporaryExpr{{.*}}'const B' | |
// CHECK: ImplicitCastExpr{{.*}}'const B' <NoOp> | |
// CHECK: CallExpr{{.*}}B | |
const A &rca = f(); | |
// CHECK: VarDecl{{.*}}r 'const A &' | |
// CHECK: ImplicitCastExpr{{.*}}'const A' lvalue <DerivedToBase (A)> | |
// CHECK: MaterializeTemporaryExpr{{.*}}'const B' | |
// CHECK: ImplicitCastExpr{{.*}}'const B' <NoOp> | |
// CHECK: CXXMemberCallExpr{{.*}}'B' | |
const A& r = x; | |
} | |
// CHECK-LABEL: example3 | |
void example3() { | |
// CHECK: VarDecl{{.*}}rcd2 'const double &' | |
// CHECK: ImplicitCastExpr{{.*}} <IntegralToFloating> | |
const double& rcd2 = 2; | |
} |