1 // RUN: %clang_cc1 -ast-dump %s 2>&1 | FileCheck %s
2
3 // CHECK-LABEL: example0
example0()4 void example0() {
5 double d = 2.0;
6 // CHECK: VarDecl{{.*}}rd 'double &'
7 // CHECK-NEXT: DeclRefExpr
8 double &rd = d;
9 // CHECK: VarDecl{{.*}}rcd 'const double &'
10 // CHECK-NEXT: ImplicitCastExpr{{.*}}'const double' lvalue <NoOp>
11 const double &rcd = d;
12 }
13
14 struct A { };
15 struct B : A { } b;
16
17 // CHECK-LABEL: example1
example1()18 void example1() {
19 // CHECK: VarDecl{{.*}}ra 'A &'
20 // CHECK: ImplicitCastExpr{{.*}}'A' lvalue <DerivedToBase (A)>
21 A &ra = b;
22 // CHECK: VarDecl{{.*}}rca 'const A &'
23 // CHECK: ImplicitCastExpr{{.*}}'const A' lvalue <DerivedToBase (A)>
24 // CHECK-NOT: MaterializeTemporaryExpr
25 // CHECK: ImplicitCastExpr{{.*}}'const B' lvalue <NoOp>
26 const A& rca = b;
27 }
28
29 extern B f();
30
31 struct X {
32 operator B();
33 } x;
34
35 // CHECK-LABEL: example2
example2()36 void example2() {
37 // CHECK: VarDecl{{.*}}rca 'const A &'
38 // CHECK: ImplicitCastExpr{{.*}}'const A' lvalue <DerivedToBase (A)>
39 // CHECK: MaterializeTemporaryExpr{{.*}}'const B'
40 // CHECK: ImplicitCastExpr{{.*}}'const B' <NoOp>
41 // CHECK: CallExpr{{.*}}B
42 const A &rca = f();
43 // CHECK: VarDecl{{.*}}r 'const A &'
44 // CHECK: ImplicitCastExpr{{.*}}'const A' lvalue <DerivedToBase (A)>
45 // CHECK: MaterializeTemporaryExpr{{.*}}'const B'
46 // CHECK: ImplicitCastExpr{{.*}}'const B' <NoOp>
47 // CHECK: CXXMemberCallExpr{{.*}}'B'
48 const A& r = x;
49 }
50
51 // CHECK-LABEL: example3
example3()52 void example3() {
53 // CHECK: VarDecl{{.*}}rcd2 'const double &'
54 // CHECK: ImplicitCastExpr{{.*}} <IntegralToFloating>
55 const double& rcd2 = 2;
56 }
57