blob: dcc055696e4dd5fe769b150b866abe6dfdfb7cf9 [file] [log] [blame]
Ulrich Weigand35668cc2012-10-24 12:22:56 +00001// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -fexceptions -fcxx-exceptions -std=c++11 -o - %s | FileCheck %s
Alexis Hunt61bc1732011-05-01 07:04:31 +00002
3struct non_trivial {
4 non_trivial();
Sebastian Redl623ea822011-05-19 05:13:44 +00005 ~non_trivial() noexcept(false);
Alexis Hunt61bc1732011-05-01 07:04:31 +00006};
7non_trivial::non_trivial() {}
Sebastian Redl623ea822011-05-19 05:13:44 +00008non_trivial::~non_trivial() noexcept(false) {}
Alexis Hunt61bc1732011-05-01 07:04:31 +00009
10// We use a virtual base to ensure that the constructor
11// delegation optimization (complete->base) can't be
12// performed.
13struct delegator {
14 non_trivial n;
15 delegator();
16 delegator(int);
17 delegator(char);
18 delegator(bool);
19};
20
21delegator::delegator() {
22 throw 0;
23}
24
Alexis Hunt9d47faf2011-05-03 23:05:34 +000025
26delegator::delegator(bool)
27{}
28
Rafael Espindolac3cde362013-12-09 14:51:17 +000029// CHECK-LABEL: define {{.*}} @_ZN9delegatorC2Ec
Eli Friedmana526f272011-06-13 22:51:21 +000030// CHECK: {{.*}} @_ZN9delegatorC2Eb
Alexis Hunt9d47faf2011-05-03 23:05:34 +000031// CHECK: void @__cxa_throw
John McCalle142ad52013-02-12 03:51:46 +000032// CHECK: void @__clang_call_terminate
Eli Friedmana526f272011-06-13 22:51:21 +000033// CHECK: {{.*}} @_ZN9delegatorD2Ev
Rafael Espindolac3cde362013-12-09 14:51:17 +000034
35// CHECK-LABEL: define {{.*}} @_ZN9delegatorC1Ec
36// CHECK: {{.*}} @_ZN9delegatorC1Eb
37// CHECK: void @__cxa_throw
38// CHECK: void @__clang_call_terminate
39// CHECK: {{.*}} @_ZN9delegatorD1Ev
Alexis Hunt9d47faf2011-05-03 23:05:34 +000040delegator::delegator(char)
41 : delegator(true) {
42 throw 0;
43}
44
Rafael Espindolac3cde362013-12-09 14:51:17 +000045// CHECK-LABEL: define {{.*}} @_ZN9delegatorC2Ei
46// CHECK: {{.*}} @_ZN9delegatorC2Ev
Alexis Huntf9b554b2011-05-04 00:59:33 +000047// CHECK-NOT: void @_ZSt9terminatev
Alexis Hunt61bc1732011-05-01 07:04:31 +000048// CHECK: ret
Alexis Huntf9b554b2011-05-04 00:59:33 +000049// CHECK-NOT: void @_ZSt9terminatev
Rafael Espindolac3cde362013-12-09 14:51:17 +000050
51// CHECK-LABEL: define {{.*}} @_ZN9delegatorC1Ei
52// CHECK: {{.*}} @_ZN9delegatorC1Ev
Alexis Huntf9b554b2011-05-04 00:59:33 +000053// CHECK-NOT: void @_ZSt9terminatev
Alexis Hunt61bc1732011-05-01 07:04:31 +000054// CHECK: ret
Alexis Huntf9b554b2011-05-04 00:59:33 +000055// CHECK-NOT: void @_ZSt9terminatev
Alexis Hunt61bc1732011-05-01 07:04:31 +000056delegator::delegator(int)
57 : delegator()
58{}
Eli Friedman02290002012-05-20 00:46:05 +000059
60namespace PR12890 {
61 class X {
62 int x;
63 X() = default;
64 X(int);
65 };
66 X::X(int) : X() {}
67}
68// CHECK: define {{.*}} @_ZN7PR128901XC1Ei(%"class.PR12890::X"* %this, i32)
Jakob Stoklund Olesen3923f1d2012-05-20 06:43:46 +000069// CHECK: call void @llvm.memset.p0i8.{{i32|i64}}(i8* {{.*}}, i8 0, {{i32|i64}} 4, i32 4, i1 false)
Douglas Gregor61535002013-01-31 05:50:40 +000070
71namespace PR14588 {
72 void other();
73
74 class Base {
75 public:
76 Base() { squawk(); }
77 virtual ~Base() {}
78
79 virtual void squawk() { other(); }
80 };
81
82
83 class Foo : public virtual Base {
84 public:
85 Foo();
86 Foo(const void * inVoid);
87 virtual ~Foo() {}
88
89 virtual void squawk() { other(); }
90 };
91
Stephen Lin43622612013-08-15 06:47:53 +000092 // CHECK-LABEL: define void @_ZN7PR145883FooC1Ev(%"class.PR14588::Foo"*
Douglas Gregor61535002013-01-31 05:50:40 +000093 // CHECK: call void @_ZN7PR145883FooC1EPKv(
94 // CHECK: invoke void @_ZN7PR145885otherEv()
95 // CHECK: call void @_ZN7PR145883FooD1Ev
96 // CHECK: resume
97
98 Foo::Foo() : Foo(__null) { other(); }
99 Foo::Foo(const void *inVoid) {
100 squawk();
101 }
102
103}