John McCall | 4c40d98 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 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 |
Chris Lattner | c9a85f9 | 2010-04-26 20:35:54 +0000 | [diff] [blame] | 2 | |
| 3 | class foo { |
| 4 | public: |
| 5 | foo(); |
| 6 | virtual ~foo(); |
| 7 | }; |
| 8 | |
| 9 | class bar : public foo { |
| 10 | public: |
| 11 | bar(); |
| 12 | }; |
| 13 | |
| 14 | // The global dtor needs the right calling conv with -fno-use-cxa-atexit |
| 15 | // rdar://7817590 |
John McCall | 4c40d98 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 16 | // Checked at end of file. |
Chris Lattner | c9a85f9 | 2010-04-26 20:35:54 +0000 | [diff] [blame] | 17 | bar baz; |
| 18 | |
John McCall | 4c40d98 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 19 | // Destructors and constructors must return this. |
| 20 | namespace 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. |
| 62 | namespace 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 Lattner | c9a85f9 | 2010-04-26 20:35:54 +0000 | [diff] [blame] | 100 | // CHECK: @_GLOBAL__D_a() |
John McCall | 4c40d98 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 101 | // CHECK: call %class.bar* @_ZN3barD1Ev(%class.bar* @baz) |