blob: de739d0ad8febd07ff56d1b4e4501112d1449a70 [file] [log] [blame]
Ulrich Weigand92309972012-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
Sean Hunt059ce0d2011-05-01 07:04:31 +00002
3struct non_trivial {
4 non_trivial();
Sebastian Redl0ee33912011-05-19 05:13:44 +00005 ~non_trivial() noexcept(false);
Sean Hunt059ce0d2011-05-01 07:04:31 +00006};
7non_trivial::non_trivial() {}
Sebastian Redl0ee33912011-05-19 05:13:44 +00008non_trivial::~non_trivial() noexcept(false) {}
Sean Hunt059ce0d2011-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
Sean Huntb76af9c2011-05-03 23:05:34 +000025
26delegator::delegator(bool)
27{}
28
Eli Friedman41f1fd42011-06-13 22:51:21 +000029// CHECK: define {{.*}} @_ZN9delegatorC1Ec
30// CHECK: {{.*}} @_ZN9delegatorC1Eb
Sean Huntb76af9c2011-05-03 23:05:34 +000031// CHECK: void @__cxa_throw
Sean Hunt3afa9752011-05-04 00:59:33 +000032// CHECK: void @_ZSt9terminatev
Eli Friedman41f1fd42011-06-13 22:51:21 +000033// CHECK: {{.*}} @_ZN9delegatorD1Ev
34// CHECK: define {{.*}} @_ZN9delegatorC2Ec
35// CHECK: {{.*}} @_ZN9delegatorC2Eb
Sean Huntb76af9c2011-05-03 23:05:34 +000036// CHECK: void @__cxa_throw
Sean Hunt3afa9752011-05-04 00:59:33 +000037// CHECK: void @_ZSt9terminatev
Eli Friedman41f1fd42011-06-13 22:51:21 +000038// CHECK: {{.*}} @_ZN9delegatorD2Ev
Sean Huntb76af9c2011-05-03 23:05:34 +000039delegator::delegator(char)
40 : delegator(true) {
41 throw 0;
42}
43
Eli Friedman41f1fd42011-06-13 22:51:21 +000044// CHECK: define {{.*}} @_ZN9delegatorC1Ei
45// CHECK: {{.*}} @_ZN9delegatorC1Ev
Sean Hunt3afa9752011-05-04 00:59:33 +000046// CHECK-NOT: void @_ZSt9terminatev
Sean Hunt059ce0d2011-05-01 07:04:31 +000047// CHECK: ret
Sean Hunt3afa9752011-05-04 00:59:33 +000048// CHECK-NOT: void @_ZSt9terminatev
Eli Friedman41f1fd42011-06-13 22:51:21 +000049// CHECK: define {{.*}} @_ZN9delegatorC2Ei
50// CHECK: {{.*}} @_ZN9delegatorC2Ev
Sean Hunt3afa9752011-05-04 00:59:33 +000051// CHECK-NOT: void @_ZSt9terminatev
Sean Hunt059ce0d2011-05-01 07:04:31 +000052// CHECK: ret
Sean Hunt3afa9752011-05-04 00:59:33 +000053// CHECK-NOT: void @_ZSt9terminatev
Sean Hunt059ce0d2011-05-01 07:04:31 +000054delegator::delegator(int)
55 : delegator()
56{}
Eli Friedmana2ac4072012-05-20 00:46:05 +000057
58namespace PR12890 {
59 class X {
60 int x;
61 X() = default;
62 X(int);
63 };
64 X::X(int) : X() {}
65}
66// CHECK: define {{.*}} @_ZN7PR128901XC1Ei(%"class.PR12890::X"* %this, i32)
Jakob Stoklund Olesen06170652012-05-20 06:43:46 +000067// CHECK: call void @llvm.memset.p0i8.{{i32|i64}}(i8* {{.*}}, i8 0, {{i32|i64}} 4, i32 4, i1 false)
Douglas Gregor378e1e72013-01-31 05:50:40 +000068
69namespace PR14588 {
70 void other();
71
72 class Base {
73 public:
74 Base() { squawk(); }
75 virtual ~Base() {}
76
77 virtual void squawk() { other(); }
78 };
79
80
81 class Foo : public virtual Base {
82 public:
83 Foo();
84 Foo(const void * inVoid);
85 virtual ~Foo() {}
86
87 virtual void squawk() { other(); }
88 };
89
90 // CHECK: define void @_ZN7PR145883FooC1Ev(%"class.PR14588::Foo"*
91 // CHECK: call void @_ZN7PR145883FooC1EPKv(
92 // CHECK: invoke void @_ZN7PR145885otherEv()
93 // CHECK: call void @_ZN7PR145883FooD1Ev
94 // CHECK: resume
95
96 Foo::Foo() : Foo(__null) { other(); }
97 Foo::Foo(const void *inVoid) {
98 squawk();
99 }
100
101}