blob: bdc97b5bd5018fbc8bdb498512234996c93a4440 [file] [log] [blame]
David Blaikie60761492012-09-10 23:06:08 +00001// RUN: %clang_cc1 -std=c++11 -S -triple armv7-none-eabi -emit-llvm -o - %s | FileCheck %s
Sebastian Redl29526f02011-11-27 16:50:07 +00002
Benjamin Kramerb2b81432015-04-09 16:09:29 +00003// CHECK: private constant { i8** } { i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTVN7PR2316510ChildClassE, i64 0, i64 2) }, align 4
4
Sebastian Redl29526f02011-11-27 16:50:07 +00005namespace reference {
6 struct A {
7 int i1, i2;
8 };
9
10 void single_init() {
11 // No superfluous instructions allowed here, they could be
12 // hiding extra temporaries.
13
14 // CHECK: store i32 1, i32*
15 // CHECK-NEXT: store i32* %{{.*}}, i32**
16 const int &cri2a = 1;
17
18 // CHECK-NEXT: store i32 1, i32*
19 // CHECK-NEXT: store i32* %{{.*}}, i32**
20 const int &cri1a = {1};
21
22 // CHECK-NEXT: store i32 1, i32*
23 int i = 1;
24 // CHECK-NEXT: store i32* %{{.*}}, i32**
25 int &ri1a = {i};
26
27 // CHECK-NEXT: bitcast
28 // CHECK-NEXT: memcpy
29 A a{1, 2};
30 // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** %
31 A &ra1a = {a};
32
Richard Smithbb653bd2012-05-14 21:57:21 +000033 using T = A&;
34 // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** %
35 A &ra1b = T{a};
36
Sebastian Redl29526f02011-11-27 16:50:07 +000037 // CHECK-NEXT: ret
38 }
39
Benjamin Kramerf8b86962015-03-07 13:37:13 +000040 void reference_to_aggregate(int i) {
Sebastian Redl29526f02011-11-27 16:50:07 +000041 // CHECK: getelementptr {{.*}}, i32 0, i32 0
42 // CHECK-NEXT: store i32 1
43 // CHECK-NEXT: getelementptr {{.*}}, i32 0, i32 1
Benjamin Kramerf8b86962015-03-07 13:37:13 +000044 // CHECK-NEXT: %[[I1:.*]] = load i32, i32*
45 // CHECK-NEXT: store i32 %[[I1]]
Sebastian Redl29526f02011-11-27 16:50:07 +000046 // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** %{{.*}}, align
Benjamin Kramerf8b86962015-03-07 13:37:13 +000047 const A &ra1{1, i};
Sebastian Redl29526f02011-11-27 16:50:07 +000048
David Blaikie218b7832015-02-27 19:18:17 +000049 // CHECK-NEXT: getelementptr inbounds [3 x i32], [3 x i32]* %{{.*}}, i{{32|64}} 0, i{{32|64}} 0
Sebastian Redl29526f02011-11-27 16:50:07 +000050 // CHECK-NEXT: store i32 1
David Blaikie218b7832015-02-27 19:18:17 +000051 // CHECK-NEXT: getelementptr inbounds i32, i32* %{{.*}}, i{{32|64}} 1
Sebastian Redl29526f02011-11-27 16:50:07 +000052 // CHECK-NEXT: store i32 2
David Blaikie218b7832015-02-27 19:18:17 +000053 // CHECK-NEXT: getelementptr inbounds i32, i32* %{{.*}}, i{{32|64}} 1
Benjamin Kramerf8b86962015-03-07 13:37:13 +000054 // CHECK-NEXT: %[[I2:.*]] = load i32, i32*
55 // CHECK-NEXT: store i32 %[[I2]]
Sebastian Redl29526f02011-11-27 16:50:07 +000056 // CHECK-NEXT: store [3 x i32]* %{{.*}}, [3 x i32]** %{{.*}}, align
Benjamin Kramerf8b86962015-03-07 13:37:13 +000057 const int (&arrayRef)[] = {1, 2, i};
58
59 // CHECK: store %{{.*}}* @{{.*}}, %{{.*}}** %{{.*}}, align
60 const A &constra1{1, 2};
61
62 // CHECK-NEXT: store [3 x i32]* @{{.*}}, [3 x i32]** %{{.*}}, align
63 const int (&constarrayRef)[] = {1, 2, 3};
Sebastian Redl29526f02011-11-27 16:50:07 +000064
65 // CHECK-NEXT: ret
66 }
67
68 struct B {
69 B();
70 ~B();
71 };
72
73 void single_init_temp_cleanup()
74 {
75 // Ensure lifetime extension.
76
David Blaikie60761492012-09-10 23:06:08 +000077 // CHECK: call %"struct.reference::B"* @_ZN9reference1BC1Ev
Sebastian Redl29526f02011-11-27 16:50:07 +000078 // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** %
79 const B &rb{ B() };
David Blaikie60761492012-09-10 23:06:08 +000080 // CHECK: call %"struct.reference::B"* @_ZN9reference1BD1Ev
Sebastian Redl29526f02011-11-27 16:50:07 +000081 }
82
83}
Benjamin Kramerb2b81432015-04-09 16:09:29 +000084
85namespace PR23165 {
86struct AbstractClass {
87 virtual void foo() const = 0;
88};
89
90struct ChildClass : public AbstractClass {
91 virtual void foo() const {}
92};
93
94void helper(const AbstractClass &param) {
95 param.foo();
96}
97
98void foo() {
99// CHECK: call void @_ZN7PR231656helperERKNS_13AbstractClassE(%{{.*}} bitcast ({ i8** }* @{{.*}} to %{{.*}}*))
100 helper(ChildClass());
101}
102}