blob: 612d12dd135312475e5938a2d5fbf08e49efdb96 [file] [log] [blame]
Charles Lie1958a02017-02-13 23:09:56 +00001// RUN: %clang_cc1 -std=gnu++98 -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-passes -o - %s | FileCheck %s
Ted Kremeneke65b0862012-03-06 20:05:56 +00002
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
Stephen Lin43622612013-08-15 06:47:53 +000017// CHECK-LABEL: define void @_Z10test_arrayv
Ted Kremeneke65b0862012-03-06 20:05:56 +000018void test_array() {
David Majnemerdc012fa2015-04-22 21:38:15 +000019 // CHECK: [[ARR:%[a-zA-Z0-9.]+]] = alloca i8*
Ted Kremeneke65b0862012-03-06 20:05:56 +000020 // CHECK: [[OBJECTS:%[a-zA-Z0-9.]+]] = alloca [2 x i8*]
Richard Smith7ed5fb22018-07-27 17:13:18 +000021 // CHECK: [[TMPX:%[a-zA-Z0-9.]+]] = alloca %
22 // CHECK: [[TMPY:%[a-zA-Z0-9.]+]] = alloca %
Ted Kremeneke65b0862012-03-06 20:05:56 +000023
24 // Initializing first element
David Majnemerdc012fa2015-04-22 21:38:15 +000025 // CHECK: [[PTR1:%.*]] = bitcast i8** [[ARR]] to i8*
Matt Arsenaultd9729492017-04-10 20:18:45 +000026 // CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* [[PTR1]])
John McCall7f416cc2015-09-08 08:05:57 +000027 // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i64 0, i64 0
Richard Smith7ed5fb22018-07-27 17:13:18 +000028 // CHECK-NEXT: [[TMP_CAST:%.*]] = bitcast {{.*}} [[TMPX]] to i8*
29 // CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* [[TMP_CAST]])
30 // CHECK-NEXT: call void @_ZN1XC1Ev({{.*}} [[TMPX]])
Ted Kremeneke65b0862012-03-06 20:05:56 +000031 // CHECK-NEXT: [[OBJECT0:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1XcvP11objc_objectEv
Akira Hatanaka65bb3f92019-03-21 19:59:49 +000032 // CHECK: [[RET0:%[a-zA-Z0-9.]+]] = notail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[OBJECT0]])
Ted Kremeneke65b0862012-03-06 20:05:56 +000033 // CHECK: store i8* [[RET0]], i8** [[ELEMENT0]]
34
35 // Initializing the second element
John McCall7f416cc2015-09-08 08:05:57 +000036 // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i64 0, i64 1
Richard Smith7ed5fb22018-07-27 17:13:18 +000037 // CHECK-NEXT: [[TMP_CAST:%.*]] = bitcast {{.*}} [[TMPY]] to i8*
38 // CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* [[TMP_CAST]])
39 // CHECK-NEXT: invoke void @_ZN1YC1Ev({{.*}} [[TMPY]])
Ted Kremeneke65b0862012-03-06 20:05:56 +000040 // CHECK: [[OBJECT1:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1YcvP11objc_objectEv
Akira Hatanaka65bb3f92019-03-21 19:59:49 +000041 // CHECK: [[RET1:%[a-zA-Z0-9.]+]] = notail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[OBJECT1]])
Ted Kremeneke65b0862012-03-06 20:05:56 +000042 // CHECK: store i8* [[RET1]], i8** [[ELEMENT1]]
43
44 // Build the array
Fariborz Jahanian9ad94aa2014-10-28 18:28:16 +000045 // CHECK: {{invoke.*@objc_msgSend}}
Pete Cooper2cd35962018-12-18 20:33:00 +000046 // CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
Ted Kremeneke65b0862012-03-06 20:05:56 +000047 id arr = @[ X(), Y() ];
48
49 // Destroy temporaries
50 // CHECK-NOT: ret void
Pete Cooper2cd35962018-12-18 20:33:00 +000051 // CHECK: call void @llvm.objc.release
Ted Kremeneke65b0862012-03-06 20:05:56 +000052 // CHECK-NOT: ret void
53 // CHECK: invoke void @_ZN1YD1Ev
54 // CHECK-NOT: ret void
Pete Cooper2cd35962018-12-18 20:33:00 +000055 // CHECK: call void @llvm.objc.release
Ted Kremeneke65b0862012-03-06 20:05:56 +000056 // CHECK-NEXT: call void @_ZN1XD1Ev
57 // CHECK-NOT: ret void
Pete Cooper2cd35962018-12-18 20:33:00 +000058 // CHECK: call void @llvm.objc.release
David Majnemerdc012fa2015-04-22 21:38:15 +000059 // CHECK-NEXT: [[PTR2:%.*]] = bitcast i8** [[ARR]] to i8*
Matt Arsenaultd9729492017-04-10 20:18:45 +000060 // CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* [[PTR2]])
Ted Kremeneke65b0862012-03-06 20:05:56 +000061 // CHECK-NEXT: ret void
62
63 // Check cleanups
Pete Cooper2cd35962018-12-18 20:33:00 +000064 // CHECK: call void @llvm.objc.release
65 // CHECK-NOT: call void @llvm.objc.release
Ted Kremeneke65b0862012-03-06 20:05:56 +000066 // CHECK: invoke void @_ZN1YD1Ev
Pete Cooper2cd35962018-12-18 20:33:00 +000067 // CHECK: call void @llvm.objc.release
68 // CHECK-NOT: call void @llvm.objc.release
Ted Kremeneke65b0862012-03-06 20:05:56 +000069 // CHECK: invoke void @_ZN1XD1Ev
Pete Cooper2cd35962018-12-18 20:33:00 +000070 // CHECK-NOT: call void @llvm.objc.release
Ted Kremeneke65b0862012-03-06 20:05:56 +000071 // CHECK: unreachable
72}
73
Stephen Lin43622612013-08-15 06:47:53 +000074// CHECK-LABEL: define weak_odr void @_Z24test_array_instantiationIiEvv
Ted Kremeneke65b0862012-03-06 20:05:56 +000075template<typename T>
76void test_array_instantiation() {
David Majnemerdc012fa2015-04-22 21:38:15 +000077 // CHECK: [[ARR:%[a-zA-Z0-9.]+]] = alloca i8*
Ted Kremeneke65b0862012-03-06 20:05:56 +000078 // CHECK: [[OBJECTS:%[a-zA-Z0-9.]+]] = alloca [2 x i8*]
79
80 // Initializing first element
David Majnemerdc012fa2015-04-22 21:38:15 +000081 // CHECK: [[PTR1:%.*]] = bitcast i8** [[ARR]] to i8*
Matt Arsenaultd9729492017-04-10 20:18:45 +000082 // CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* [[PTR1]])
John McCall7f416cc2015-09-08 08:05:57 +000083 // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i64 0, i64 0
Richard Smith7ed5fb22018-07-27 17:13:18 +000084 // CHECK: call void @_ZN1XC1Ev
Ted Kremeneke65b0862012-03-06 20:05:56 +000085 // CHECK-NEXT: [[OBJECT0:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1XcvP11objc_objectEv
Akira Hatanaka65bb3f92019-03-21 19:59:49 +000086 // CHECK: [[RET0:%[a-zA-Z0-9.]+]] = notail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[OBJECT0]])
Ted Kremeneke65b0862012-03-06 20:05:56 +000087 // CHECK: store i8* [[RET0]], i8** [[ELEMENT0]]
88
89 // Initializing the second element
John McCall7f416cc2015-09-08 08:05:57 +000090 // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i64 0, i64 1
Richard Smith7ed5fb22018-07-27 17:13:18 +000091 // CHECK: invoke void @_ZN1YC1Ev
Ted Kremeneke65b0862012-03-06 20:05:56 +000092 // CHECK: [[OBJECT1:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1YcvP11objc_objectEv
Akira Hatanaka65bb3f92019-03-21 19:59:49 +000093 // CHECK: [[RET1:%[a-zA-Z0-9.]+]] = notail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[OBJECT1]])
Ted Kremeneke65b0862012-03-06 20:05:56 +000094 // CHECK: store i8* [[RET1]], i8** [[ELEMENT1]]
95
96 // Build the array
97 // CHECK: {{invoke.*@objc_msgSend}}
Pete Cooper2cd35962018-12-18 20:33:00 +000098 // CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
Ted Kremeneke65b0862012-03-06 20:05:56 +000099 id arr = @[ X(), Y() ];
100
101 // Destroy temporaries
102 // CHECK-NOT: ret void
Pete Cooper2cd35962018-12-18 20:33:00 +0000103 // CHECK: call void @llvm.objc.release
Ted Kremeneke65b0862012-03-06 20:05:56 +0000104 // CHECK-NOT: ret void
105 // CHECK: invoke void @_ZN1YD1Ev
106 // CHECK-NOT: ret void
Pete Cooper2cd35962018-12-18 20:33:00 +0000107 // CHECK: call void @llvm.objc.release
Ted Kremeneke65b0862012-03-06 20:05:56 +0000108 // CHECK-NEXT: call void @_ZN1XD1Ev
109 // CHECK-NOT: ret void
Pete Cooper2cd35962018-12-18 20:33:00 +0000110 // CHECK: call void @llvm.objc.release
David Majnemerdc012fa2015-04-22 21:38:15 +0000111 // CHECK-NEXT: [[PTR2]] = bitcast i8** [[ARR]] to i8*
Matt Arsenaultd9729492017-04-10 20:18:45 +0000112 // CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* [[PTR2]])
Ted Kremeneke65b0862012-03-06 20:05:56 +0000113 // CHECK-NEXT: ret void
114
115 // Check cleanups
Pete Cooper2cd35962018-12-18 20:33:00 +0000116 // CHECK: call void @llvm.objc.release
117 // CHECK-NOT: call void @llvm.objc.release
Ted Kremeneke65b0862012-03-06 20:05:56 +0000118 // CHECK: invoke void @_ZN1YD1Ev
Pete Cooper2cd35962018-12-18 20:33:00 +0000119 // CHECK: call void @llvm.objc.release
120 // CHECK-NOT: call void @llvm.objc.release
Ted Kremeneke65b0862012-03-06 20:05:56 +0000121 // CHECK: invoke void @_ZN1XD1Ev
Pete Cooper2cd35962018-12-18 20:33:00 +0000122 // CHECK-NOT: call void @llvm.objc.release
Ted Kremeneke65b0862012-03-06 20:05:56 +0000123 // CHECK: unreachable
124}
125
126template void test_array_instantiation<int>();
127