// RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s
struct A {
~A();
};
struct B {
~B() throw(int);
};
struct C {
B b;
~C() {}
};
struct D {
~D() noexcept(false);
};
struct E {
D d;
~E() {}
};
void foo() {
A a;
C c;
E e;
// CHECK: invoke {{.*}} @_ZN1ED1Ev
// CHECK: invoke {{.*}} @_ZN1CD1Ev
// CHECK: call {{.*}} @_ZN1AD1Ev
}
struct F {
D d;
~F();
};
F::~F() noexcept(false) {}
struct G {
D d;
~G();
};
G::~G() {}
struct H {
B b;
~H() throw(int);
};
H::~H() throw(int) {}
struct I {
B b;
~I();
};
I::~I() {}
// Template variants.
template <typename T>
struct TA {
~TA();
};
template <typename T>
struct TB {
~TB() throw(int);
};
template <typename T>
struct TC {
TB<T> b;
~TC() {}
};
template <typename T>
struct TD {
~TD() noexcept(false);
};
template <typename T>
struct TE {
TD<T> d;
~TE() {}
};
void tfoo() {
TA<int> a;
TC<int> c;
TE<int> e;
// CHECK: invoke {{.*}} @_ZN2TEIiED1Ev
// CHECK: invoke {{.*}} @_ZN2TCIiED1Ev
// CHECK: call {{.*}} @_ZN2TAIiED1Ev
}
template <typename T>
struct TF {
TD<T> d;
~TF();
};
template <typename T>
TF<T>::~TF() noexcept(false) {}
template <typename T>
struct TG {
TD<T> d;
~TG();
};
template <typename T>
TG<T>::~TG() {}
template <typename T>
struct TH {
TB<T> b;
~TH();
};
template <typename T>
TH<T>::~TH() {}
void tinst() {
TF<int> f;
TG<int> g;
TH<int> h;
}
// CHECK: define linkonce_odr {{.*}} @_ZN2THIiED1Ev
// CHECK: _ZTIi
// CHECK: __cxa_call_unexpected
struct VX
{ virtual ~VX() {} };
struct VY : VX
{ virtual ~VY() {} };
template<typename T>
struct TVY : VX
{ virtual ~TVY() {} };
struct VA {
B b;
virtual ~VA() {}
};
struct VB : VA
{ virtual ~VB() {} };
template<typename T>
struct TVB : VA
{ virtual ~TVB() {} };
void tinst2() {
TVY<int> tvy;
TVB<int> tvb;
}
template <typename T>
struct Sw {
T t;
~Sw() {}
};
void tsw() {
Sw<int> swi;
Sw<B> swb;
}
// CHECK-NOT: define linkonce_odr {{.*}} @_ZN2SwI1BED1Ev({{.*}} #
// CHECK: define linkonce_odr {{.*}} @_ZN2SwI1BED1Ev({{.*}}
// CHECK: _ZTIi
// CHECK: __cxa_call_unexpected
// CHECK: define linkonce_odr {{.*}} @_ZN2SwIiED1Ev({{.*}} [[ATTRGRP:#[0-9]+]]
template <typename T>
struct TVC : VX
{ virtual ~TVC(); };
template <typename T>
TVC<T>::~TVC() {}
// CHECK: attributes [[ATTRGRP]] = { nounwind{{.*}} }