xref: /aosp_15_r20/external/clang/test/CodeGenCXX/cxx0x-delegating-ctors.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -fexceptions -fcxx-exceptions -std=c++11 -o - %s | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li struct non_trivial {
4*67e74705SXin Li   non_trivial();
5*67e74705SXin Li   ~non_trivial() noexcept(false);
6*67e74705SXin Li };
non_trivial()7*67e74705SXin Li non_trivial::non_trivial() {}
~non_trivial()8*67e74705SXin Li non_trivial::~non_trivial() noexcept(false) {}
9*67e74705SXin Li 
10*67e74705SXin Li // We use a virtual base to ensure that the constructor
11*67e74705SXin Li // delegation optimization (complete->base) can't be
12*67e74705SXin Li // performed.
13*67e74705SXin Li struct delegator {
14*67e74705SXin Li   non_trivial n;
15*67e74705SXin Li   delegator();
16*67e74705SXin Li   delegator(int);
17*67e74705SXin Li   delegator(char);
18*67e74705SXin Li   delegator(bool);
19*67e74705SXin Li };
20*67e74705SXin Li 
delegator()21*67e74705SXin Li delegator::delegator() {
22*67e74705SXin Li   throw 0;
23*67e74705SXin Li }
24*67e74705SXin Li 
25*67e74705SXin Li 
delegator(bool)26*67e74705SXin Li delegator::delegator(bool)
27*67e74705SXin Li {}
28*67e74705SXin Li 
29*67e74705SXin Li // CHECK-LABEL: define {{.*}} @_ZN9delegatorC2Ec
30*67e74705SXin Li // CHECK: {{.*}} @_ZN9delegatorC2Eb
31*67e74705SXin Li // CHECK: void @__cxa_throw
32*67e74705SXin Li // CHECK: void @__clang_call_terminate
33*67e74705SXin Li // CHECK: {{.*}} @_ZN9delegatorD2Ev
34*67e74705SXin Li 
35*67e74705SXin Li // CHECK-LABEL: define {{.*}} @_ZN9delegatorC1Ec
36*67e74705SXin Li // CHECK: {{.*}} @_ZN9delegatorC1Eb
37*67e74705SXin Li // CHECK: void @__cxa_throw
38*67e74705SXin Li // CHECK: void @__clang_call_terminate
39*67e74705SXin Li // CHECK: {{.*}} @_ZN9delegatorD1Ev
delegator(char)40*67e74705SXin Li delegator::delegator(char)
41*67e74705SXin Li   : delegator(true) {
42*67e74705SXin Li   throw 0;
43*67e74705SXin Li }
44*67e74705SXin Li 
45*67e74705SXin Li // CHECK-LABEL: define {{.*}} @_ZN9delegatorC2Ei
46*67e74705SXin Li // CHECK: {{.*}} @_ZN9delegatorC2Ev
47*67e74705SXin Li // CHECK-NOT: void @_ZSt9terminatev
48*67e74705SXin Li // CHECK: ret
49*67e74705SXin Li // CHECK-NOT: void @_ZSt9terminatev
50*67e74705SXin Li 
51*67e74705SXin Li // CHECK-LABEL: define {{.*}} @_ZN9delegatorC1Ei
52*67e74705SXin Li // CHECK: {{.*}} @_ZN9delegatorC1Ev
53*67e74705SXin Li // CHECK-NOT: void @_ZSt9terminatev
54*67e74705SXin Li // CHECK: ret
55*67e74705SXin Li // CHECK-NOT: void @_ZSt9terminatev
delegator(int)56*67e74705SXin Li delegator::delegator(int)
57*67e74705SXin Li   : delegator()
58*67e74705SXin Li {}
59*67e74705SXin Li 
60*67e74705SXin Li namespace PR12890 {
61*67e74705SXin Li   class X {
62*67e74705SXin Li     int x;
63*67e74705SXin Li     X() = default;
64*67e74705SXin Li     X(int);
65*67e74705SXin Li   };
X(int)66*67e74705SXin Li   X::X(int) : X() {}
67*67e74705SXin Li }
68*67e74705SXin Li // CHECK: define {{.*}} @_ZN7PR128901XC1Ei(%"class.PR12890::X"* %this, i32)
69*67e74705SXin Li // CHECK: call void @llvm.memset.p0i8.{{i32|i64}}(i8* {{.*}}, i8 0, {{i32|i64}} 4, i32 4, i1 false)
70*67e74705SXin Li 
71*67e74705SXin Li namespace PR14588 {
72*67e74705SXin Li   void other();
73*67e74705SXin Li 
74*67e74705SXin Li   class Base {
75*67e74705SXin Li   public:
Base()76*67e74705SXin Li     Base() { squawk(); }
~Base()77*67e74705SXin Li     virtual ~Base() {}
78*67e74705SXin Li 
squawk()79*67e74705SXin Li     virtual void squawk() { other(); }
80*67e74705SXin Li   };
81*67e74705SXin Li 
82*67e74705SXin Li 
83*67e74705SXin Li   class Foo : public virtual Base {
84*67e74705SXin Li   public:
85*67e74705SXin Li     Foo();
86*67e74705SXin Li     Foo(const void * inVoid);
~Foo()87*67e74705SXin Li     virtual ~Foo() {}
88*67e74705SXin Li 
squawk()89*67e74705SXin Li     virtual void squawk() { other(); }
90*67e74705SXin Li   };
91*67e74705SXin Li 
92*67e74705SXin Li   // CHECK-LABEL: define void @_ZN7PR145883FooC1Ev(%"class.PR14588::Foo"*
93*67e74705SXin Li   // CHECK: call void @_ZN7PR145883FooC1EPKv(
94*67e74705SXin Li   // CHECK: invoke void @_ZN7PR145885otherEv()
95*67e74705SXin Li   // CHECK: call void @_ZN7PR145883FooD1Ev
96*67e74705SXin Li   // CHECK: resume
97*67e74705SXin Li 
Foo()98*67e74705SXin Li   Foo::Foo() : Foo(__null) { other(); }
Foo(const void * inVoid)99*67e74705SXin Li   Foo::Foo(const void *inVoid) {
100*67e74705SXin Li     squawk();
101*67e74705SXin Li   }
102*67e74705SXin Li 
103*67e74705SXin Li }
104