arm.cpp revision 4c40d98ab7acf5f27fa89b17bd8fc0ef7683df37
1// 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
2
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
16// Checked at end of file.
17bar baz;
18
19// 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
100// CHECK: @_GLOBAL__D_a()
101// CHECK: call %class.bar* @_ZN3barD1Ev(%class.bar* @baz)
102