blob: b4c8c835e455e7572cd8a65cc3a8791bc8ce7661 [file] [log] [blame]
John McCall4c40d982010-08-31 07:33:07 +00001// RUN: %clang_cc1 %s -triple=thumbv7-apple-darwin3.0.0-iphoneos -fno-use-cxa-atexit -target-abi apcs-gnu -emit-llvm -o - -fexceptions | FileCheck %s
Chris Lattnerc9a85f92010-04-26 20:35:54 +00002
3class foo {
4public:
5 foo();
6 virtual ~foo();
7};
8
9class bar : public foo {
10public:
11 bar();
12};
13
14// The global dtor needs the right calling conv with -fno-use-cxa-atexit
15// rdar://7817590
John McCall4c40d982010-08-31 07:33:07 +000016// Checked at end of file.
Chris Lattnerc9a85f92010-04-26 20:35:54 +000017bar baz;
18
John McCall4c40d982010-08-31 07:33:07 +000019// Destructors and constructors must return this.
20namespace test1 {
21 void foo();
22
23 struct A {
24 A(int i) { foo(); }
25 ~A() { foo(); }
26 void bar() { foo(); }
27 };
28
29 // CHECK: define void @_ZN5test14testEv()
30 void test() {
31 // CHECK: [[AV:%.*]] = alloca [[A:%.*]], align 1
32 // CHECK: call [[A]]* @_ZN5test11AC1Ei([[A]]* [[AV]], i32 10)
33 // CHECK: invoke void @_ZN5test11A3barEv([[A]]* [[AV]])
34 // CHECK: call [[A]]* @_ZN5test11AD1Ev([[A]]* [[AV]])
35 // CHECK: ret void
36 A a = 10;
37 a.bar();
38 }
39
40 // CHECK: define linkonce_odr [[A]]* @_ZN5test11AC1Ei([[A]]*
41 // CHECK: [[RET:%.*]] = alloca [[A]]*, align 4
42 // CHECK: [[THIS:%.*]] = alloca [[A]]*, align 4
43 // CHECK: store [[A]]* {{.*}}, [[A]]** [[THIS]]
44 // CHECK: [[THIS1:%.*]] = load [[A]]** [[THIS]]
45 // CHECK: store [[A]]* [[THIS1]], [[A]]** [[RET]]
46 // CHECK: call [[A]]* @_ZN5test11AC2Ei(
47 // CHECK: [[THIS2:%.*]] = load [[A]]** [[RET]]
48 // CHECK: ret [[A]]* [[THIS2]]
49
50 // CHECK: define linkonce_odr [[A]]* @_ZN5test11AD1Ev([[A]]*
51 // CHECK: [[RET:%.*]] = alloca [[A]]*, align 4
52 // CHECK: [[THIS:%.*]] = alloca [[A]]*, align 4
53 // CHECK: store [[A]]* {{.*}}, [[A]]** [[THIS]]
54 // CHECK: [[THIS1:%.*]] = load [[A]]** [[THIS]]
55 // CHECK: store [[A]]* [[THIS1]], [[A]]** [[RET]]
56 // CHECK: call [[A]]* @_ZN5test11AD2Ev(
57 // CHECK: [[THIS2:%.*]] = load [[A]]** [[RET]]
58 // CHECK: ret [[A]]* [[THIS2]]
59}
60
61// Awkward virtual cases.
62namespace test2 {
63 void foo();
64
65 struct A {
66 int x;
67
68 A(int);
69 virtual ~A() { foo(); }
70 };
71
72 struct B {
73 int y;
74 int z;
75
76 B(int);
77 virtual ~B() { foo(); }
78 };
79
80 struct C : A, virtual B {
81 int q;
82
83 C(int i) : A(i), B(i) { foo(); }
84 ~C() { foo(); }
85 };
86
87 void test() {
88 C c = 10;
89 }
90
91 // CHECK: define linkonce_odr [[C:%.*]]* @_ZTv0_n12_N5test21CD1Ev(
92 // CHECK: call [[C]]* @_ZN5test21CD1Ev(
93 // CHECK: ret [[C]]* undef
94
95 // CHECK: define linkonce_odr void @_ZTv0_n12_N5test21CD0Ev(
96 // CHECK: call void @_ZN5test21CD0Ev(
97 // CHECK: ret void
98}
99
Chris Lattnerc9a85f92010-04-26 20:35:54 +0000100// CHECK: @_GLOBAL__D_a()
John McCall4c40d982010-08-31 07:33:07 +0000101// CHECK: call %class.bar* @_ZN3barD1Ev(%class.bar* @baz)