| // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -fexceptions -fcxx-exceptions -std=c++11 -o - %s | FileCheck %s | |
| struct non_trivial { | |
| non_trivial(); | |
| ~non_trivial() noexcept(false); | |
| }; | |
| non_trivial::non_trivial() {} | |
| non_trivial::~non_trivial() noexcept(false) {} | |
| // We use a virtual base to ensure that the constructor | |
| // delegation optimization (complete->base) can't be | |
| // performed. | |
| struct delegator { | |
| non_trivial n; | |
| delegator(); | |
| delegator(int); | |
| delegator(char); | |
| delegator(bool); | |
| }; | |
| delegator::delegator() { | |
| throw 0; | |
| } | |
| delegator::delegator(bool) | |
| {} | |
| // CHECK-LABEL: define {{.*}} @_ZN9delegatorC2Ec | |
| // CHECK: {{.*}} @_ZN9delegatorC2Eb | |
| // CHECK: void @__cxa_throw | |
| // CHECK: void @__clang_call_terminate | |
| // CHECK: {{.*}} @_ZN9delegatorD2Ev | |
| // CHECK-LABEL: define {{.*}} @_ZN9delegatorC1Ec | |
| // CHECK: {{.*}} @_ZN9delegatorC1Eb | |
| // CHECK: void @__cxa_throw | |
| // CHECK: void @__clang_call_terminate | |
| // CHECK: {{.*}} @_ZN9delegatorD1Ev | |
| delegator::delegator(char) | |
| : delegator(true) { | |
| throw 0; | |
| } | |
| // CHECK-LABEL: define {{.*}} @_ZN9delegatorC2Ei | |
| // CHECK: {{.*}} @_ZN9delegatorC2Ev | |
| // CHECK-NOT: void @_ZSt9terminatev | |
| // CHECK: ret | |
| // CHECK-NOT: void @_ZSt9terminatev | |
| // CHECK-LABEL: define {{.*}} @_ZN9delegatorC1Ei | |
| // CHECK: {{.*}} @_ZN9delegatorC1Ev | |
| // CHECK-NOT: void @_ZSt9terminatev | |
| // CHECK: ret | |
| // CHECK-NOT: void @_ZSt9terminatev | |
| delegator::delegator(int) | |
| : delegator() | |
| {} | |
| namespace PR12890 { | |
| class X { | |
| int x; | |
| X() = default; | |
| X(int); | |
| }; | |
| X::X(int) : X() {} | |
| } | |
| // CHECK: define {{.*}} @_ZN7PR128901XC1Ei(ptr {{[^,]*}} %this, i32 noundef %0) | |
| // CHECK: call void @llvm.memset.p0.{{i32|i64}}(ptr align 4 {{.*}}, i8 0, {{i32|i64}} 4, i1 false) | |
| namespace PR14588 { | |
| void other(); | |
| class Base { | |
| public: | |
| Base() { squawk(); } | |
| virtual ~Base() {} | |
| virtual void squawk() { other(); } | |
| }; | |
| class Foo : public virtual Base { | |
| public: | |
| Foo(); | |
| Foo(const void * inVoid); | |
| virtual ~Foo() {} | |
| virtual void squawk() { other(); } | |
| }; | |
| // CHECK-LABEL: define{{.*}} void @_ZN7PR145883FooC1Ev(ptr | |
| // CHECK: call void @_ZN7PR145883FooC1EPKv( | |
| // CHECK: invoke void @_ZN7PR145885otherEv() | |
| // CHECK: call void @_ZN7PR145883FooD1Ev | |
| // CHECK: resume | |
| Foo::Foo() : Foo(__null) { other(); } | |
| Foo::Foo(const void *inVoid) { | |
| squawk(); | |
| } | |
| } |