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 Linon_trivial::non_trivial() {} ~non_trivial()8*67e74705SXin Linon_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 Lidelegator::delegator() { 22*67e74705SXin Li throw 0; 23*67e74705SXin Li } 24*67e74705SXin Li 25*67e74705SXin Li delegator(bool)26*67e74705SXin Lidelegator::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 Lidelegator::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 Lidelegator::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