1 // RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - -mconstructor-aliases -fcxx-exceptions -fexceptions | FileCheck %s
2 
3 // CHECK: @_ZN5test01AD1Ev = alias {{.*}} @_ZN5test01AD2Ev
4 // CHECK: @_ZN5test11MD2Ev = alias {{.*}} @_ZN5test11AD2Ev
5 // CHECK: @_ZN5test11ND2Ev = alias {{.*}} @_ZN5test11AD2Ev
6 // CHECK: @_ZN5test11OD2Ev = alias {{.*}} @_ZN5test11AD2Ev
7 // CHECK: @_ZN5test11SD2Ev = alias bitcast {{.*}} @_ZN5test11AD2Ev
8 
9 // CHECK: @_ZN6test106foobarIvEC1Ev = alias weak_odr void (%"struct.test10::foobar"*)* @_ZN6test106foobarIvEC2Ev
10 
11 // CHECK: @_ZN6test116foobarIvEC1Ev = alias linkonce_odr void (%"struct.test11::foobar"*)* @_ZN6test116foobarIvEC2Ev
12 
13 // CHECK: @_ZN5test312_GLOBAL__N_11DD1Ev = alias internal {{.*}} @_ZN5test312_GLOBAL__N_11DD2Ev
14 // CHECK: @_ZN5test312_GLOBAL__N_11DD2Ev = alias internal bitcast {{.*}} @_ZN5test312_GLOBAL__N_11CD2Ev
15 // CHECK: @_ZN5test312_GLOBAL__N_11CD1Ev = alias internal {{.*}} @_ZN5test312_GLOBAL__N_11CD2Ev
16 
17 // CHECK: @_ZN6PR752617allocator_derivedD1Ev = alias linkonce_odr void (%"struct.PR7526::allocator_derived"*)* @_ZN6PR752617allocator_derivedD2Ev
18 
19 struct A {
20   int a;
21 
22   ~A();
23 };
24 
25 // Base with non-trivial destructor
26 struct B : A {
27   ~B();
28 };
29 
30 B::~B() { }
31 
32 // Field with non-trivial destructor
33 struct C {
34   A a;
35 
36   ~C();
37 };
38 
39 C::~C() { }
40 
41 namespace PR7526 {
42   extern void foo();
43   struct allocator {
44     ~allocator() throw();
45   };
46 
47   struct allocator_derived : allocator { };
48 
49   // CHECK-LABEL: define void @_ZN6PR75269allocatorD2Ev(%"struct.PR7526::allocator"* %this) unnamed_addr
50   // CHECK: call void @__cxa_call_unexpected
51   allocator::~allocator() throw() { foo(); }
52 
53   void foo() {
54     allocator_derived ad;
55   }
56 }
57 
58 // PR5084
59 template<typename T>
60 class A1 {
61   ~A1();
62 };
63 
64 template<> A1<char>::~A1();
65 
66 // PR5529
67 namespace PR5529 {
68   struct A {
69     ~A();
70   };
71 
72   A::~A() { }
73   struct B : A {
74     virtual ~B();
75   };
76 
77   B::~B()  {}
78 }
79 
80 // FIXME: there's a known problem in the codegen here where, if one
81 // destructor throws, the remaining destructors aren't run.  Fix it,
82 // then make this code check for it.
83 namespace test0 {
84   void foo();
85   struct VBase { ~VBase(); };
86   struct Base { ~Base(); };
87   struct Member { ~Member(); };
88 
89   struct A : Base {
90     Member M;
91     ~A();
92   };
93 
94   // The function-try-block won't suppress -mconstructor-aliases here.
95   A::~A() try { } catch (int i) {}
96 
97 // complete destructor alias tested above
98 
99 // CHECK-LABEL: define void @_ZN5test01AD2Ev(%"struct.test0::A"* %this) unnamed_addr
100 // CHECK: invoke void @_ZN5test06MemberD1Ev
101 // CHECK:   unwind label [[MEM_UNWIND:%[a-zA-Z0-9.]+]]
102 // CHECK: invoke void @_ZN5test04BaseD2Ev
103 // CHECK:   unwind label [[BASE_UNWIND:%[a-zA-Z0-9.]+]]
104 
105   struct B : Base, virtual VBase {
106     Member M;
107     ~B();
108   };
109   B::~B() try { } catch (int i) {}
110   // It will suppress the delegation optimization here, though.
111 
112 // CHECK-LABEL: define void @_ZN5test01BD1Ev(%"struct.test0::B"* %this) unnamed_addr
113 // CHECK: invoke void @_ZN5test06MemberD1Ev
114 // CHECK:   unwind label [[MEM_UNWIND:%[a-zA-Z0-9.]+]]
115 // CHECK: invoke void @_ZN5test04BaseD2Ev
116 // CHECK:   unwind label [[BASE_UNWIND:%[a-zA-Z0-9.]+]]
117 // CHECK: invoke void @_ZN5test05VBaseD2Ev
118 // CHECK:   unwind label [[VBASE_UNWIND:%[a-zA-Z0-9.]+]]
119 
120 // CHECK-LABEL: define void @_ZN5test01BD2Ev(%"struct.test0::B"* %this, i8** %vtt) unnamed_addr
121 // CHECK: invoke void @_ZN5test06MemberD1Ev
122 // CHECK:   unwind label [[MEM_UNWIND:%[a-zA-Z0-9.]+]]
123 // CHECK: invoke void @_ZN5test04BaseD2Ev
124 // CHECK:   unwind label [[BASE_UNWIND:%[a-zA-Z0-9.]+]]
125 }
126 
127 // Test base-class aliasing.
128 namespace test1 {
129   struct A { ~A(); char ***m; }; // non-trivial destructor
130   struct B { ~B(); }; // non-trivial destructor
131   struct Empty { }; // trivial destructor, empty
132   struct NonEmpty { int x; }; // trivial destructor, non-empty
133 
134   // There must be a definition in this translation unit for the alias
135   // optimization to apply.
136   A::~A() { delete m; }
137 
138   struct M : A { ~M(); };
139   M::~M() {} // alias tested above
140 
141   struct N : A, Empty { ~N(); };
142   N::~N() {} // alias tested above
143 
144   struct O : Empty, A { ~O(); };
145   O::~O() {} // alias tested above
146 
147   struct P : NonEmpty, A { ~P(); };
148   P::~P() {} // CHECK-LABEL: define void @_ZN5test11PD2Ev(%"struct.test1::P"* %this) unnamed_addr
149 
150   struct Q : A, B { ~Q(); };
151   Q::~Q() {} // CHECK-LABEL: define void @_ZN5test11QD2Ev(%"struct.test1::Q"* %this) unnamed_addr
152 
153   struct R : A { ~R(); };
154   R::~R() { A a; } // CHECK-LABEL: define void @_ZN5test11RD2Ev(%"struct.test1::R"* %this) unnamed_addr
155 
156   struct S : A { ~S(); int x; };
157   S::~S() {} // alias tested above
158 
159   struct T : A { ~T(); B x; };
160   T::~T() {} // CHECK-LABEL: define void @_ZN5test11TD2Ev(%"struct.test1::T"* %this) unnamed_addr
161 
162   // The VTT parameter prevents this.  We could still make this work
163   // for calling conventions that are safe against extra parameters.
164   struct U : A, virtual B { ~U(); };
165   U::~U() {} // CHECK-LABEL: define void @_ZN5test11UD2Ev(%"struct.test1::U"* %this, i8** %vtt) unnamed_addr
166 }
167 
168 // PR6471
169 namespace test2 {
170   struct A { ~A(); char ***m; };
171   struct B : A { ~B(); };
172 
173   B::~B() {}
174   // CHECK-LABEL: define void @_ZN5test21BD2Ev(%"struct.test2::B"* %this) unnamed_addr
175   // CHECK: call void @_ZN5test21AD2Ev
176 }
177 
178 // PR7142
179 namespace test3 {
180   struct A { virtual ~A(); };
181   struct B { virtual ~B(); };
182   namespace { // internal linkage => deferred
183     struct C : A, B {}; // ~B() in D requires a this-adjustment thunk
184     struct D : C {};    // D::~D() is an alias to C::~C()
185   }
186 
187   void test() {
188     new D; // Force emission of D's vtable
189   }
190 
191   // Checked at top of file:
192   // @_ZN5test312_GLOBAL__N_11CD1Ev = alias internal {{.*}} @_ZN5test312_GLOBAL__N_11CD2Ev
193 
194   // More checks at end of file.
195 
196 }
197 
198 namespace test4 {
199   struct A { ~A(); };
200 
201   // CHECK-LABEL: define void @_ZN5test43fooEv()
202   // CHECK: call void @_ZN5test41AD1Ev
203   // CHECK: ret void
204   void foo() {
205     {
206       A a;
207       goto failure;
208     }
209 
210   failure:
211     return;
212   }
213 
214   // CHECK-LABEL: define void @_ZN5test43barEi(
215   // CHECK:      [[X:%.*]] = alloca i32
216   // CHECK-NEXT: [[A:%.*]] = alloca
217   // CHECK:      br label
218   // CHECK:      [[TMP:%.*]] = load i32* [[X]]
219   // CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP]], 0
220   // CHECK-NEXT: br i1
221   // CHECK:      call void @_ZN5test41AD1Ev(
222   // CHECK:      br label
223   // CHECK:      [[TMP:%.*]] = load i32* [[X]]
224   // CHECK:      [[TMP2:%.*]] = add nsw i32 [[TMP]], -1
225   // CHECK:      store i32 [[TMP2]], i32* [[X]]
226   // CHECK:      br label
227   // CHECK:      ret void
228   void bar(int x) {
229     for (A a; x; ) {
230       x--;
231     }
232   }
233 }
234 
235 // PR7575
236 namespace test5 {
237   struct A { ~A(); };
238 
239   // CHECK-LABEL: define void @_ZN5test53fooEv()
240   // CHECK:      [[ELEMS:%.*]] = alloca [5 x [[A:%.*]]], align
241   // CHECK-NEXT: [[EXN:%.*]] = alloca i8*
242   // CHECK-NEXT: [[SEL:%.*]] = alloca i32
243   // CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [5 x [[A]]]* [[ELEMS]], i32 0, i32 0
244   // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 5
245   // CHECK-NEXT: br label
246   // CHECK:      [[POST:%.*]] = phi [[A]]* [ [[END]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
247   // CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]]* [[POST]], i64 -1
248   // CHECK-NEXT: invoke void @_ZN5test51AD1Ev([[A]]* [[ELT]])
249   // CHECK:      [[T0:%.*]] = icmp eq [[A]]* [[ELT]], [[BEGIN]]
250   // CHECK-NEXT: br i1 [[T0]],
251   // CHECK:      ret void
252   // lpad
253   // CHECK:      [[EMPTY:%.*]] = icmp eq [[A]]* [[BEGIN]], [[ELT]]
254   // CHECK-NEXT: br i1 [[EMPTY]]
255   // CHECK:      [[AFTER:%.*]] = phi [[A]]* [ [[ELT]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
256   // CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]]* [[AFTER]], i64 -1
257   // CHECK-NEXT: invoke void @_ZN5test51AD1Ev([[A]]* [[CUR]])
258   // CHECK:      [[DONE:%.*]] = icmp eq [[A]]* [[CUR]], [[BEGIN]]
259   // CHECK-NEXT: br i1 [[DONE]],
260   void foo() {
261     A elems[5];
262   }
263 }
264 
265 namespace test6 {
266   void opaque();
267 
268   struct A { ~A(); };
269   template <unsigned> struct B { B(); ~B(); int _; };
270   struct C : B<0>, B<1>, virtual B<2>, virtual B<3> {
271     A x, y, z;
272 
273     C();
274     ~C();
275   };
276 
277   C::C() { opaque(); }
278   // CHECK-LABEL: define void @_ZN5test61CC1Ev(%"struct.test6::C"* %this) unnamed_addr
279   // CHECK:   call void @_ZN5test61BILj2EEC2Ev
280   // CHECK:   invoke void @_ZN5test61BILj3EEC2Ev
281   // CHECK:   invoke void @_ZN5test61BILj0EEC2Ev
282   // CHECK:   invoke void @_ZN5test61BILj1EEC2Ev
283   // CHECK:   invoke void @_ZN5test66opaqueEv
284   // CHECK:   ret void
285   // FIXME: way too much EH cleanup code follows
286 
287   C::~C() { opaque(); }
288   // CHECK-LABEL: define void @_ZN5test61CD1Ev(%"struct.test6::C"* %this) unnamed_addr
289   // CHECK:   invoke void @_ZN5test61CD2Ev
290   // CHECK:   invoke void @_ZN5test61BILj3EED2Ev
291   // CHECK:   call void @_ZN5test61BILj2EED2Ev
292   // CHECK:   ret void
293   // CHECK:   invoke void @_ZN5test61BILj3EED2Ev
294   // CHECK:   invoke void @_ZN5test61BILj2EED2Ev
295 
296   // CHECK-LABEL: define void @_ZN5test61CD2Ev(%"struct.test6::C"* %this, i8** %vtt) unnamed_addr
297   // CHECK:   invoke void @_ZN5test66opaqueEv
298   // CHECK:   invoke void @_ZN5test61AD1Ev
299   // CHECK:   invoke void @_ZN5test61AD1Ev
300   // CHECK:   invoke void @_ZN5test61AD1Ev
301   // CHECK:   invoke void @_ZN5test61BILj1EED2Ev
302   // CHECK:   call void @_ZN5test61BILj0EED2Ev
303   // CHECK:   ret void
304   // CHECK:   invoke void @_ZN5test61AD1Ev
305   // CHECK:   invoke void @_ZN5test61AD1Ev
306   // CHECK:   invoke void @_ZN5test61AD1Ev
307   // CHECK:   invoke void @_ZN5test61BILj1EED2Ev
308   // CHECK:   invoke void @_ZN5test61BILj0EED2Ev
309 }
310 
311 // PR 9197
312 namespace test7 {
313   struct D { ~D(); };
314 
315   struct A { ~A(); };
316   A::~A() { }
317 
318   struct B : public A {
319     ~B();
320     D arr[1];
321   };
322 
323   // Verify that this doesn't get emitted as an alias
324   // CHECK-LABEL: define void @_ZN5test71BD2Ev(
325   // CHECK:   invoke void @_ZN5test71DD1Ev(
326   // CHECK:   call void @_ZN5test71AD2Ev(
327   B::~B() {}
328 }
329 
330 // PR10467
331 namespace test8 {
332   struct A { A(); ~A(); };
333 
334   void die() __attribute__((noreturn));
335   void test() {
336     A x;
337     while (1) {
338       A y;
339       goto l;
340     }
341   l: die();
342   }
343 
344   // CHECK-LABEL:    define void @_ZN5test84testEv()
345   // CHECK:      [[X:%.*]] = alloca [[A:%.*]], align 1
346   // CHECK-NEXT: [[Y:%.*]] = alloca [[A:%.*]], align 1
347   // CHECK:      call void @_ZN5test81AC1Ev([[A]]* [[X]])
348   // CHECK-NEXT: br label
349   // CHECK:      invoke void @_ZN5test81AC1Ev([[A]]* [[Y]])
350   // CHECK:      invoke void @_ZN5test81AD1Ev([[A]]* [[Y]])
351   // CHECK-NOT:  switch
352   // CHECK:      invoke void @_ZN5test83dieEv()
353   // CHECK:      unreachable
354 }
355 
356 // PR12710
357 namespace test9 {
358   struct ArgType {
359     ~ArgType();
360   };
361   template<typename T>
362   void f1(const ArgType& = ArgType());
363   void f2();
364   void bar() {
365     f1<int>();
366     f2();
367   }
368   // CHECK: call void @_ZN5test97ArgTypeD1Ev(%"struct.test9::ArgType"* %
369   // CHECK: call void @_ZN5test92f2Ev()
370 }
371 
372 // Checks from test3:
373 
374   // CHECK-LABEL: define internal void @_ZN5test312_GLOBAL__N_11DD0Ev(%"struct.test3::<anonymous namespace>::D"* %this) unnamed_addr
375   // CHECK: invoke void @_ZN5test312_GLOBAL__N_11DD1Ev(
376   // CHECK: call void @_ZdlPv({{.*}}) [[NUW:#[0-9]+]]
377   // CHECK: ret void
378   // CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
379   // CHECK-NEXT: cleanup
380   // CHECK: call void @_ZdlPv({{.*}}) [[NUW]]
381   // CHECK: resume { i8*, i32 }
382 
383   // Checked at top of file:
384   // @_ZN5test312_GLOBAL__N_11DD1Ev = alias internal {{.*}} @_ZN5test312_GLOBAL__N_11DD2Ev
385   // @_ZN5test312_GLOBAL__N_11DD2Ev = alias internal bitcast {{.*}} @_ZN5test312_GLOBAL__N_11CD2Ev
386 
387   // CHECK-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11DD1Ev(
388   // CHECK: getelementptr inbounds i8* {{.*}}, i64 -8
389   // CHECK: call void @_ZN5test312_GLOBAL__N_11DD1Ev(
390   // CHECK: ret void
391 
392   // CHECK-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11DD0Ev(
393   // CHECK: getelementptr inbounds i8* {{.*}}, i64 -8
394   // CHECK: call void @_ZN5test312_GLOBAL__N_11DD0Ev(
395   // CHECK: ret void
396 
397   // CHECK-LABEL: define internal void @_ZN5test312_GLOBAL__N_11CD2Ev(%"struct.test3::<anonymous namespace>::C"* %this) unnamed_addr
398   // CHECK: invoke void @_ZN5test31BD2Ev(
399   // CHECK: call void @_ZN5test31AD2Ev(
400   // CHECK: ret void
401 
402   // CHECK: declare void @_ZN5test31BD2Ev(
403   // CHECK: declare void @_ZN5test31AD2Ev(
404 
405   // CHECK-LABEL: define internal void @_ZN5test312_GLOBAL__N_11CD0Ev(%"struct.test3::<anonymous namespace>::C"* %this) unnamed_addr
406   // CHECK: invoke void @_ZN5test312_GLOBAL__N_11CD1Ev(
407   // CHECK: call void @_ZdlPv({{.*}}) [[NUW]]
408   // CHECK: ret void
409   // CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
410   // CHECK-NEXT: cleanup
411   // CHECK: call void @_ZdlPv({{.*}}) [[NUW]]
412   // CHECK: resume { i8*, i32 }
413 
414   // CHECK-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11CD1Ev(
415   // CHECK: getelementptr inbounds i8* {{.*}}, i64 -8
416   // CHECK: call void @_ZN5test312_GLOBAL__N_11CD1Ev(
417   // CHECK: ret void
418 
419   // CHECK-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11CD0Ev(
420   // CHECK: getelementptr inbounds i8* {{.*}}, i64 -8
421   // CHECK: call void @_ZN5test312_GLOBAL__N_11CD0Ev(
422   // CHECK: ret void
423 
424   // CHECK: attributes [[NUW]] = {{[{].*}} nounwind {{.*[}]}}
425 
426 
427 namespace test10 {
428   template<typename T>
429   struct foobar {
430     foobar() {
431     }
432   };
433 
434   template struct foobar<void>;
435 }
436 
437 namespace test11 {
438   void g();
439   template<typename T>
440   struct foobar {
441     foobar() {
442       g();
443     }
444   };
445   foobar<void> x;
446 }
447