// 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; }