blob: 2337eee071f0a79185604a079551c89e28b71cd0 [file] [log] [blame]
John McCall7d8647f2010-09-14 07:57:04 +00001// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - -fexceptions | FileCheck %s
Anders Carlsson8370c582009-12-11 00:32:37 +00002
John McCall7d8647f2010-09-14 07:57:04 +00003typedef typeof(sizeof(0)) size_t;
Anders Carlsson8370c582009-12-11 00:32:37 +00004
John McCall7d8647f2010-09-14 07:57:04 +00005// This just shouldn't crash.
6namespace test0 {
7 struct allocator {
8 allocator();
9 allocator(const allocator&);
10 ~allocator();
11 };
Anders Carlsson8370c582009-12-11 00:32:37 +000012
John McCall7d8647f2010-09-14 07:57:04 +000013 void f();
14 void g(bool b, bool c) {
15 if (b) {
16 if (!c)
17 throw allocator();
18
19 return;
20 }
21 f();
Anders Carlsson8370c582009-12-11 00:32:37 +000022 }
John McCall7d8647f2010-09-14 07:57:04 +000023}
24
25namespace test1 {
26 struct A { A(int); A(int, int); ~A(); void *p; };
27
28 A *a() {
29 // CHECK: define [[A:%.*]]* @_ZN5test11aEv()
30 // CHECK: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8)
31 // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
32 // CHECK-NEXT: invoke void @_ZN5test11AC1Ei([[A]]* [[CAST]], i32 5)
33 // CHECK: ret [[A]]* [[CAST]]
34 // CHECK: call void @_ZdlPv(i8* [[NEW]])
35 return new A(5);
36 }
37
38 A *b() {
39 // CHECK: define [[A:%.*]]* @_ZN5test11bEv()
40 // CHECK: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8)
41 // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
42 // CHECK-NEXT: [[FOO:%.*]] = invoke i32 @_ZN5test13fooEv()
43 // CHECK: invoke void @_ZN5test11AC1Ei([[A]]* [[CAST]], i32 [[FOO]])
44 // CHECK: ret [[A]]* [[CAST]]
45 // CHECK: call void @_ZdlPv(i8* [[NEW]])
46 extern int foo();
47 return new A(foo());
48 }
49
50 struct B { B(); ~B(); operator int(); int x; };
51 B makeB();
52
53 A *c() {
54 // CHECK: define [[A:%.*]]* @_ZN5test11cEv()
55 // CHECK: [[ACTIVE:%.*]] = alloca i1
56 // CHECK-NEXT: store i1 true, i1* [[ACTIVE]]
57 // CHECK-NEXT: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8)
58 // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
59 // CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* [[T0:%.*]])
60 // CHECK: [[T1:%.*]] = getelementptr inbounds [[B]]* [[T0]], i32 0, i32 0
61 // CHECK-NEXT: [[T2:%.*]] = load i32* [[T1]], align 4
62 // CHECK-NEXT: invoke void @_ZN5test11AC1Ei([[A]]* [[CAST]], i32 [[T2]])
63 // CHECK: store i1 false, i1* [[ACTIVE]]
64 // CHECK-NEXT: invoke void @_ZN5test11BD1Ev([[B]]* [[T0]])
65 // CHECK: ret [[A]]* [[CAST]]
66 // CHECK: [[ISACTIVE:%.*]] = load i1* [[ACTIVE]]
67 // CHECK-NEXT: br i1 [[ISACTIVE]]
68 // CHECK: call void @_ZdlPv(i8* [[NEW]])
69 return new A(B().x);
70 }
71
72 A *d() {
73 // CHECK: define [[A:%.*]]* @_ZN5test11dEv()
74 // CHECK: [[ACTIVE:%.*]] = alloca i1
75 // CHECK-NEXT: store i1 true, i1* [[ACTIVE]]
76 // CHECK-NEXT: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8)
77 // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
78 // CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* [[T0:%.*]])
79 // CHECK: [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* [[T0]])
80 // CHECK: invoke void @_ZN5test11AC1Ei([[A]]* [[CAST]], i32 [[T1]])
81 // CHECK: store i1 false, i1* [[ACTIVE]]
82 // CHECK-NEXT: invoke void @_ZN5test11BD1Ev([[B]]* [[T0]])
83 // CHECK: ret [[A]]* [[CAST]]
84 // CHECK: [[ISACTIVE:%.*]] = load i1* [[ACTIVE]]
85 // CHECK-NEXT: br i1 [[ISACTIVE]]
86 // CHECK: call void @_ZdlPv(i8* [[NEW]])
87 return new A(B());
88 }
89
90 A *e() {
91 // CHECK: define [[A:%.*]]* @_ZN5test11eEv()
92 // CHECK: [[ACTIVE:%.*]] = alloca i1
93 // CHECK-NEXT: store i1 true, i1* [[ACTIVE]]
94 // CHECK-NEXT: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8)
95 // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
96 // CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* [[T0:%.*]])
97 // CHECK: [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* [[T0]])
98 // CHECK: invoke void @_ZN5test11BC1Ev([[B]]* [[T2:%.*]])
99 // CHECK: [[T3:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* [[T2]])
100 // CHECK: invoke void @_ZN5test11AC1Eii([[A]]* [[CAST]], i32 [[T1]], i32 [[T3]])
101 // CHECK: store i1 false, i1* [[ACTIVE]]
102 // CHECK-NEXT: invoke void @_ZN5test11BD1Ev([[B]]* [[T2]])
103 // CHECK: invoke void @_ZN5test11BD1Ev([[B]]* [[T0]])
104 // CHECK: ret [[A]]* [[CAST]]
105 // CHECK: [[ISACTIVE:%.*]] = load i1* [[ACTIVE]]
106 // CHECK-NEXT: br i1 [[ISACTIVE]]
107 // CHECK: call void @_ZdlPv(i8* [[NEW]])
108 return new A(B(), B());
109 }
110 A *f() {
111 return new A(makeB().x);
112 }
113 A *g() {
114 return new A(makeB());
115 }
116 A *h() {
117 return new A(makeB(), makeB());
118 }
119
120 A *i() {
121 // CHECK: define [[A:%.*]]* @_ZN5test11iEv()
122 // CHECK: [[X:%.*]] = alloca [[A]]*, align 8
123 // CHECK: [[ACTIVE:%.*]] = alloca i1
124 // CHECK: store i1 true, i1* [[ACTIVE]]
125 // CHECK-NEXT: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8)
126 // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
127 // CHECK-NEXT: invoke void @_ZN5test15makeBEv([[B:%.*]]* sret [[T0:%.*]])
128 // CHECK: [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* [[T0]])
129 // CHECK: invoke void @_ZN5test11AC1Ei([[A]]* [[CAST]], i32 [[T1]])
130 // CHECK: store i1 false, i1* [[ACTIVE]]
131 // CHECK-NEXT: store [[A]]* [[CAST]], [[A]]** [[X]], align 8
132 // CHECK: invoke void @_ZN5test15makeBEv([[B:%.*]]* sret [[T2:%.*]])
133 // CHECK: [[RET:%.*]] = load [[A]]** [[X]], align 8
134 // CHECK: invoke void @_ZN5test11BD1Ev([[B]]* [[T2]])
135 // CHECK: invoke void @_ZN5test11BD1Ev([[B]]* [[T0]])
136 // CHECK: ret [[A]]* [[RET]]
137 // CHECK: [[ISACTIVE:%.*]] = load i1* [[ACTIVE]]
138 // CHECK-NEXT: br i1 [[ISACTIVE]]
139 // CHECK: call void @_ZdlPv(i8* [[NEW]])
140 A *x;
141 return (x = new A(makeB()), makeB(), x);
142 }
143}
144
145namespace test2 {
146 struct A {
147 A(int); A(int, int); ~A();
148 void *p;
149 void *operator new(size_t);
150 void operator delete(void*, size_t);
151 };
152
153 A *a() {
154 // CHECK: define [[A:%.*]]* @_ZN5test21aEv()
155 // CHECK: [[NEW:%.*]] = call i8* @_ZN5test21AnwEm(i64 8)
156 // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
157 // CHECK-NEXT: invoke void @_ZN5test21AC1Ei([[A]]* [[CAST]], i32 5)
158 // CHECK: ret [[A]]* [[CAST]]
159 // CHECK: invoke void @_ZN5test21AdlEPvm(i8* [[NEW]], i64 8)
160 // CHECK: call void @_ZSt9terminatev()
161 return new A(5);
162 }
163}
164
165namespace test3 {
166 struct A {
167 A(int); A(int, int); ~A();
168 void *p;
169 void *operator new(size_t, void*, void*);
170 void operator delete(void*, void*, void*);
171 };
172
173 A *a() {
174 // CHECK: define [[A:%.*]]* @_ZN5test31aEv()
175 // CHECK: [[FOO:%.*]] = call i8* @_ZN5test33fooEv()
176 // CHECK: [[BAR:%.*]] = call i8* @_ZN5test33barEv()
177 // CHECK: [[NEW:%.*]] = call i8* @_ZN5test31AnwEmPvS1_(i64 8, i8* [[FOO]], i8* [[BAR]])
178 // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
179 // CHECK-NEXT: invoke void @_ZN5test31AC1Ei([[A]]* [[CAST]], i32 5)
180 // CHECK: ret [[A]]* [[CAST]]
181 // CHECK: invoke void @_ZN5test31AdlEPvS1_S1_(i8* [[NEW]], i8* [[FOO]], i8* [[BAR]])
182 // CHECK: call void @_ZSt9terminatev()
183 extern void *foo(), *bar();
184
185 return new(foo(),bar()) A(5);
186 }
187}
188
189namespace test4 {
190 struct A {
191 A(int); A(int, int); ~A();
192 void *p;
193 void *operator new(size_t, void*, void*);
194 void operator delete(void*, size_t, void*, void*); // not a match
195 };
196
197 A *a() {
198 // CHECK: define [[A:%.*]]* @_ZN5test41aEv()
199 // CHECK: [[FOO:%.*]] = call i8* @_ZN5test43fooEv()
200 // CHECK-NEXT: [[BAR:%.*]] = call i8* @_ZN5test43barEv()
201 // CHECK-NEXT: [[NEW:%.*]] = call i8* @_ZN5test41AnwEmPvS1_(i64 8, i8* [[FOO]], i8* [[BAR]])
202 // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
203 // CHECK-NEXT: call void @_ZN5test41AC1Ei([[A]]* [[CAST]], i32 5)
204 // CHECK-NEXT: ret [[A]]* [[CAST]]
205 extern void *foo(), *bar();
206
207 return new(foo(),bar()) A(5);
208 }
209
Anders Carlsson8370c582009-12-11 00:32:37 +0000210}