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