xref: /aosp_15_r20/external/clang/test/CodeGenObjCXX/literals.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -I %S/Inputs -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -fobjc-runtime-has-weak -fexceptions -fobjc-exceptions -fcxx-exceptions -fobjc-arc-exceptions -O2 -disable-llvm-optzns -o - %s | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li#include "literal-support.h"
4*67e74705SXin Li
5*67e74705SXin Listruct X {
6*67e74705SXin Li  X();
7*67e74705SXin Li  ~X();
8*67e74705SXin Li  operator id() const;
9*67e74705SXin Li};
10*67e74705SXin Li
11*67e74705SXin Listruct Y {
12*67e74705SXin Li  Y();
13*67e74705SXin Li  ~Y();
14*67e74705SXin Li  operator id() const;
15*67e74705SXin Li};
16*67e74705SXin Li
17*67e74705SXin Li// CHECK-LABEL: define void @_Z10test_arrayv
18*67e74705SXin Livoid test_array() {
19*67e74705SXin Li  // CHECK: [[ARR:%[a-zA-Z0-9.]+]] = alloca i8*
20*67e74705SXin Li  // CHECK: [[OBJECTS:%[a-zA-Z0-9.]+]] = alloca [2 x i8*]
21*67e74705SXin Li
22*67e74705SXin Li  // Initializing first element
23*67e74705SXin Li  // CHECK: [[PTR1:%.*]] = bitcast i8** [[ARR]] to i8*
24*67e74705SXin Li  // CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[PTR1]])
25*67e74705SXin Li  // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i64 0, i64 0
26*67e74705SXin Li  // CHECK-NEXT: call void @_ZN1XC1Ev
27*67e74705SXin Li  // CHECK-NEXT: [[OBJECT0:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1XcvP11objc_objectEv
28*67e74705SXin Li  // CHECK: [[RET0:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT0]])
29*67e74705SXin Li  // CHECK: store i8* [[RET0]], i8** [[ELEMENT0]]
30*67e74705SXin Li
31*67e74705SXin Li  // Initializing the second element
32*67e74705SXin Li  // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i64 0, i64 1
33*67e74705SXin Li  // CHECK-NEXT: invoke void @_ZN1YC1Ev
34*67e74705SXin Li  // CHECK: [[OBJECT1:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1YcvP11objc_objectEv
35*67e74705SXin Li  // CHECK: [[RET1:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT1]])
36*67e74705SXin Li  // CHECK: store i8* [[RET1]], i8** [[ELEMENT1]]
37*67e74705SXin Li
38*67e74705SXin Li  // Build the array
39*67e74705SXin Li  // CHECK: {{invoke.*@objc_msgSend}}
40*67e74705SXin Li  // CHECK: call i8* @objc_retainAutoreleasedReturnValue
41*67e74705SXin Li  id arr = @[ X(), Y() ];
42*67e74705SXin Li
43*67e74705SXin Li  // Destroy temporaries
44*67e74705SXin Li  // CHECK-NOT: ret void
45*67e74705SXin Li  // CHECK: call void @objc_release
46*67e74705SXin Li  // CHECK-NOT: ret void
47*67e74705SXin Li  // CHECK: invoke void @_ZN1YD1Ev
48*67e74705SXin Li  // CHECK-NOT: ret void
49*67e74705SXin Li  // CHECK: call void @objc_release
50*67e74705SXin Li  // CHECK-NEXT: call void @_ZN1XD1Ev
51*67e74705SXin Li  // CHECK-NOT: ret void
52*67e74705SXin Li  // CHECK: call void @objc_release
53*67e74705SXin Li  // CHECK-NEXT: [[PTR2:%.*]] = bitcast i8** [[ARR]] to i8*
54*67e74705SXin Li  // CHECK-NEXT: call void @llvm.lifetime.end(i64 8, i8* [[PTR2]])
55*67e74705SXin Li  // CHECK-NEXT: ret void
56*67e74705SXin Li
57*67e74705SXin Li  // Check cleanups
58*67e74705SXin Li  // CHECK: call void @objc_release
59*67e74705SXin Li  // CHECK-NOT: call void @objc_release
60*67e74705SXin Li  // CHECK: invoke void @_ZN1YD1Ev
61*67e74705SXin Li  // CHECK: call void @objc_release
62*67e74705SXin Li  // CHECK-NOT: call void @objc_release
63*67e74705SXin Li  // CHECK: invoke void @_ZN1XD1Ev
64*67e74705SXin Li  // CHECK-NOT: call void @objc_release
65*67e74705SXin Li  // CHECK: unreachable
66*67e74705SXin Li}
67*67e74705SXin Li
68*67e74705SXin Li// CHECK-LABEL: define weak_odr void @_Z24test_array_instantiationIiEvv
69*67e74705SXin Litemplate<typename T>
70*67e74705SXin Livoid test_array_instantiation() {
71*67e74705SXin Li  // CHECK: [[ARR:%[a-zA-Z0-9.]+]] = alloca i8*
72*67e74705SXin Li  // CHECK: [[OBJECTS:%[a-zA-Z0-9.]+]] = alloca [2 x i8*]
73*67e74705SXin Li
74*67e74705SXin Li  // Initializing first element
75*67e74705SXin Li  // CHECK:      [[PTR1:%.*]] = bitcast i8** [[ARR]] to i8*
76*67e74705SXin Li  // CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[PTR1]])
77*67e74705SXin Li  // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i64 0, i64 0
78*67e74705SXin Li  // CHECK-NEXT: call void @_ZN1XC1Ev
79*67e74705SXin Li  // CHECK-NEXT: [[OBJECT0:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1XcvP11objc_objectEv
80*67e74705SXin Li  // CHECK: [[RET0:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT0]])
81*67e74705SXin Li  // CHECK: store i8* [[RET0]], i8** [[ELEMENT0]]
82*67e74705SXin Li
83*67e74705SXin Li  // Initializing the second element
84*67e74705SXin Li  // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i64 0, i64 1
85*67e74705SXin Li  // CHECK-NEXT: invoke void @_ZN1YC1Ev
86*67e74705SXin Li  // CHECK: [[OBJECT1:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1YcvP11objc_objectEv
87*67e74705SXin Li  // CHECK: [[RET1:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT1]])
88*67e74705SXin Li  // CHECK: store i8* [[RET1]], i8** [[ELEMENT1]]
89*67e74705SXin Li
90*67e74705SXin Li  // Build the array
91*67e74705SXin Li  // CHECK: {{invoke.*@objc_msgSend}}
92*67e74705SXin Li  // CHECK: call i8* @objc_retainAutoreleasedReturnValue
93*67e74705SXin Li  id arr = @[ X(), Y() ];
94*67e74705SXin Li
95*67e74705SXin Li  // Destroy temporaries
96*67e74705SXin Li  // CHECK-NOT: ret void
97*67e74705SXin Li  // CHECK: call void @objc_release
98*67e74705SXin Li  // CHECK-NOT: ret void
99*67e74705SXin Li  // CHECK: invoke void @_ZN1YD1Ev
100*67e74705SXin Li  // CHECK-NOT: ret void
101*67e74705SXin Li  // CHECK: call void @objc_release
102*67e74705SXin Li  // CHECK-NEXT: call void @_ZN1XD1Ev
103*67e74705SXin Li  // CHECK-NOT: ret void
104*67e74705SXin Li  // CHECK: call void @objc_release
105*67e74705SXin Li  // CHECK-NEXT: [[PTR2]] = bitcast i8** [[ARR]] to i8*
106*67e74705SXin Li  // CHECK-NEXT: call void @llvm.lifetime.end(i64 8, i8* [[PTR2]])
107*67e74705SXin Li  // CHECK-NEXT: ret void
108*67e74705SXin Li
109*67e74705SXin Li  // Check cleanups
110*67e74705SXin Li  // CHECK: call void @objc_release
111*67e74705SXin Li  // CHECK-NOT: call void @objc_release
112*67e74705SXin Li  // CHECK: invoke void @_ZN1YD1Ev
113*67e74705SXin Li  // CHECK: call void @objc_release
114*67e74705SXin Li  // CHECK-NOT: call void @objc_release
115*67e74705SXin Li  // CHECK: invoke void @_ZN1XD1Ev
116*67e74705SXin Li  // CHECK-NOT: call void @objc_release
117*67e74705SXin Li  // CHECK: unreachable
118*67e74705SXin Li}
119*67e74705SXin Li
120*67e74705SXin Litemplate void test_array_instantiation<int>();
121*67e74705SXin Li
122