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