xref: /aosp_15_r20/external/clang/test/CodeGenCXX/cxx0x-initializer-references.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -S -triple armv7-none-eabi -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li namespace reference {
4*67e74705SXin Li   struct A {
5*67e74705SXin Li     int i1, i2;
6*67e74705SXin Li   };
7*67e74705SXin Li 
single_init()8*67e74705SXin Li   void single_init() {
9*67e74705SXin Li     // No superfluous instructions allowed here, they could be
10*67e74705SXin Li     // hiding extra temporaries.
11*67e74705SXin Li 
12*67e74705SXin Li     // CHECK: store i32 1, i32*
13*67e74705SXin Li     // CHECK-NEXT: store i32* %{{.*}}, i32**
14*67e74705SXin Li     const int &cri2a = 1;
15*67e74705SXin Li 
16*67e74705SXin Li     // CHECK-NEXT: store i32 1, i32*
17*67e74705SXin Li     // CHECK-NEXT: store i32* %{{.*}}, i32**
18*67e74705SXin Li     const int &cri1a = {1};
19*67e74705SXin Li 
20*67e74705SXin Li     // CHECK-NEXT: store i32 1, i32*
21*67e74705SXin Li     int i = 1;
22*67e74705SXin Li     // CHECK-NEXT: store i32* %{{.*}}, i32**
23*67e74705SXin Li     int &ri1a = {i};
24*67e74705SXin Li 
25*67e74705SXin Li     // CHECK-NEXT: bitcast
26*67e74705SXin Li     // CHECK-NEXT: memcpy
27*67e74705SXin Li     A a{1, 2};
28*67e74705SXin Li     // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** %
29*67e74705SXin Li     A &ra1a = {a};
30*67e74705SXin Li 
31*67e74705SXin Li     using T = A&;
32*67e74705SXin Li     // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** %
33*67e74705SXin Li     A &ra1b = T{a};
34*67e74705SXin Li 
35*67e74705SXin Li     // CHECK-NEXT: ret
36*67e74705SXin Li   }
37*67e74705SXin Li 
reference_to_aggregate(int i)38*67e74705SXin Li   void reference_to_aggregate(int i) {
39*67e74705SXin Li     // CHECK: getelementptr {{.*}}, i32 0, i32 0
40*67e74705SXin Li     // CHECK-NEXT: store i32 1
41*67e74705SXin Li     // CHECK-NEXT: getelementptr {{.*}}, i32 0, i32 1
42*67e74705SXin Li     // CHECK-NEXT: %[[I1:.*]] = load i32, i32*
43*67e74705SXin Li     // CHECK-NEXT: store i32 %[[I1]]
44*67e74705SXin Li     // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** %{{.*}}, align
45*67e74705SXin Li     const A &ra1{1, i};
46*67e74705SXin Li 
47*67e74705SXin Li     // CHECK-NEXT: getelementptr inbounds [3 x i32], [3 x i32]* %{{.*}}, i{{32|64}} 0, i{{32|64}} 0
48*67e74705SXin Li     // CHECK-NEXT: store i32 1
49*67e74705SXin Li     // CHECK-NEXT: getelementptr inbounds i32, i32* %{{.*}}, i{{32|64}} 1
50*67e74705SXin Li     // CHECK-NEXT: store i32 2
51*67e74705SXin Li     // CHECK-NEXT: getelementptr inbounds i32, i32* %{{.*}}, i{{32|64}} 1
52*67e74705SXin Li     // CHECK-NEXT: %[[I2:.*]] = load i32, i32*
53*67e74705SXin Li     // CHECK-NEXT: store i32 %[[I2]]
54*67e74705SXin Li     // CHECK-NEXT: store [3 x i32]* %{{.*}}, [3 x i32]** %{{.*}}, align
55*67e74705SXin Li     const int (&arrayRef)[] = {1, 2, i};
56*67e74705SXin Li 
57*67e74705SXin Li     // CHECK: store %{{.*}}* @{{.*}}, %{{.*}}** %{{.*}}, align
58*67e74705SXin Li     const A &constra1{1, 2};
59*67e74705SXin Li 
60*67e74705SXin Li     // CHECK-NEXT: store [3 x i32]* @{{.*}}, [3 x i32]** %{{.*}}, align
61*67e74705SXin Li     const int (&constarrayRef)[] = {1, 2, 3};
62*67e74705SXin Li 
63*67e74705SXin Li     // CHECK-NEXT: ret
64*67e74705SXin Li   }
65*67e74705SXin Li 
66*67e74705SXin Li   struct B {
67*67e74705SXin Li     B();
68*67e74705SXin Li     ~B();
69*67e74705SXin Li   };
70*67e74705SXin Li 
single_init_temp_cleanup()71*67e74705SXin Li   void single_init_temp_cleanup()
72*67e74705SXin Li   {
73*67e74705SXin Li     // Ensure lifetime extension.
74*67e74705SXin Li 
75*67e74705SXin Li     // CHECK: call %"struct.reference::B"* @_ZN9reference1BC1Ev
76*67e74705SXin Li     // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** %
77*67e74705SXin Li     const B &rb{ B() };
78*67e74705SXin Li     // CHECK: call %"struct.reference::B"* @_ZN9reference1BD1Ev
79*67e74705SXin Li   }
80*67e74705SXin Li 
81*67e74705SXin Li }
82*67e74705SXin Li 
83*67e74705SXin Li namespace PR23165 {
84*67e74705SXin Li struct AbstractClass {
85*67e74705SXin Li   virtual void foo() const = 0;
86*67e74705SXin Li };
87*67e74705SXin Li 
88*67e74705SXin Li struct ChildClass : public AbstractClass {
fooPR23165::ChildClass89*67e74705SXin Li   virtual void foo() const {}
90*67e74705SXin Li };
91*67e74705SXin Li 
helper(const AbstractClass & param)92*67e74705SXin Li void helper(const AbstractClass &param) {
93*67e74705SXin Li   param.foo();
94*67e74705SXin Li }
95*67e74705SXin Li 
foo()96*67e74705SXin Li void foo() {
97*67e74705SXin Li // CHECK-LABEL: @_ZN7PR231653fooEv
98*67e74705SXin Li // CHECK: call {{.*}} @_ZN7PR2316510ChildClassC1Ev
99*67e74705SXin Li // CHECK: call void @_ZN7PR231656helperERKNS_13AbstractClassE
100*67e74705SXin Li   helper(ChildClass());
101*67e74705SXin Li }
102*67e74705SXin Li 
103*67e74705SXin Li struct S { struct T { int a; } t; mutable int b; };
f()104*67e74705SXin Li void f() {
105*67e74705SXin Li // CHECK-LABEL: _ZN7PR231651fEv
106*67e74705SXin Li // CHECK: alloca
107*67e74705SXin Li // CHECK: alloca
108*67e74705SXin Li // CHECK: store
109*67e74705SXin Li   const S::T &r = S().t;
110*67e74705SXin Li }
111*67e74705SXin Li }
112