blob: b8946fa3f805f7bc096687fa2be85529f1db01b8 [file] [log] [blame]
Ted Kremenekebcb57a2012-03-06 20:05:56 +00001// 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
5struct X {
6 X();
7 ~X();
8 operator id() const;
9};
10
11struct Y {
12 Y();
13 ~Y();
14 operator id() const;
15};
16
17// CHECK: define void @_Z10test_arrayv
18void test_array() {
19 // CHECK: [[OBJECTS:%[a-zA-Z0-9.]+]] = alloca [2 x i8*]
20
21 // Initializing first element
22 // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*]* [[OBJECTS]], i32 0, i32 0
23 // CHECK-NEXT: call void @_ZN1XC1Ev
24 // CHECK-NEXT: [[OBJECT0:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1XcvP11objc_objectEv
25 // CHECK: [[RET0:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT0]])
26 // CHECK: store i8* [[RET0]], i8** [[ELEMENT0]]
27
28 // Initializing the second element
29 // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*]* [[OBJECTS]], i32 0, i32 1
30 // CHECK-NEXT: invoke void @_ZN1YC1Ev
31 // CHECK: [[OBJECT1:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1YcvP11objc_objectEv
32 // CHECK: [[RET1:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT1]])
33 // CHECK: store i8* [[RET1]], i8** [[ELEMENT1]]
34
35 // Build the array
36 // CHECK: {{invoke.*@objc_msgSend}}
37 // CHECK: call i8* @objc_retainAutoreleasedReturnValue
38 id arr = @[ X(), Y() ];
39
40 // Destroy temporaries
41 // CHECK-NOT: ret void
42 // CHECK: call void @objc_release
43 // CHECK-NOT: ret void
44 // CHECK: invoke void @_ZN1YD1Ev
45 // CHECK-NOT: ret void
46 // CHECK: call void @objc_release
47 // CHECK-NEXT: call void @_ZN1XD1Ev
48 // CHECK-NOT: ret void
49 // CHECK: call void @objc_release
50 // CHECK-NEXT: ret void
51
52 // Check cleanups
53 // CHECK: call void @objc_release
54 // CHECK-NOT: call void @objc_release
55 // CHECK: invoke void @_ZN1YD1Ev
56 // CHECK: call void @objc_release
57 // CHECK-NOT: call void @objc_release
58 // CHECK: invoke void @_ZN1XD1Ev
59 // CHECK-NOT: call void @objc_release
60 // CHECK: unreachable
61}
62
63// CHECK: define weak_odr void @_Z24test_array_instantiationIiEvv
64template<typename T>
65void test_array_instantiation() {
66 // CHECK: [[OBJECTS:%[a-zA-Z0-9.]+]] = alloca [2 x i8*]
67
68 // Initializing first element
69 // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*]* [[OBJECTS]], i32 0, i32 0
70 // CHECK-NEXT: call void @_ZN1XC1Ev
71 // CHECK-NEXT: [[OBJECT0:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1XcvP11objc_objectEv
72 // CHECK: [[RET0:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT0]])
73 // CHECK: store i8* [[RET0]], i8** [[ELEMENT0]]
74
75 // Initializing the second element
76 // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*]* [[OBJECTS]], i32 0, i32 1
77 // CHECK-NEXT: invoke void @_ZN1YC1Ev
78 // CHECK: [[OBJECT1:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1YcvP11objc_objectEv
79 // CHECK: [[RET1:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT1]])
80 // CHECK: store i8* [[RET1]], i8** [[ELEMENT1]]
81
82 // Build the array
83 // CHECK: {{invoke.*@objc_msgSend}}
84 // CHECK: call i8* @objc_retainAutoreleasedReturnValue
85 id arr = @[ X(), Y() ];
86
87 // Destroy temporaries
88 // CHECK-NOT: ret void
89 // CHECK: call void @objc_release
90 // CHECK-NOT: ret void
91 // CHECK: invoke void @_ZN1YD1Ev
92 // CHECK-NOT: ret void
93 // CHECK: call void @objc_release
94 // CHECK-NEXT: call void @_ZN1XD1Ev
95 // CHECK-NOT: ret void
96 // CHECK: call void @objc_release
97 // CHECK-NEXT: ret void
98
99 // Check cleanups
100 // CHECK: call void @objc_release
101 // CHECK-NOT: call void @objc_release
102 // CHECK: invoke void @_ZN1YD1Ev
103 // CHECK: call void @objc_release
104 // CHECK-NOT: call void @objc_release
105 // CHECK: invoke void @_ZN1XD1Ev
106 // CHECK-NOT: call void @objc_release
107 // CHECK: unreachable
108}
109
110template void test_array_instantiation<int>();
111