1// RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s 2 3struct A { 4 ~A(); 5}; 6 7struct B { 8 ~B() throw(int); 9}; 10 11struct C { 12 B b; 13 ~C() {} 14}; 15 16struct D { 17 ~D() noexcept(false); 18}; 19 20struct E { 21 D d; 22 ~E() {} 23}; 24 25void foo() { 26 A a; 27 C c; 28 E e; 29 // CHECK: invoke {{.*}} @_ZN1ED1Ev 30 // CHECK: invoke {{.*}} @_ZN1CD1Ev 31 // CHECK: call {{.*}} @_ZN1AD1Ev 32} 33 34struct F { 35 D d; 36 ~F(); 37}; 38F::~F() noexcept(false) {} 39 40struct G { 41 D d; 42 ~G(); 43}; 44G::~G() {} 45 46struct H { 47 B b; 48 ~H() throw(int); 49}; 50H::~H() throw(int) {} 51 52struct I { 53 B b; 54 ~I(); 55}; 56I::~I() {} 57 58// Template variants. 59 60template <typename T> 61struct TA { 62 ~TA(); 63}; 64 65template <typename T> 66struct TB { 67 ~TB() throw(int); 68}; 69 70template <typename T> 71struct TC { 72 TB<T> b; 73 ~TC() {} 74}; 75 76template <typename T> 77struct TD { 78 ~TD() noexcept(false); 79}; 80 81template <typename T> 82struct TE { 83 TD<T> d; 84 ~TE() {} 85}; 86 87void tfoo() { 88 TA<int> a; 89 TC<int> c; 90 TE<int> e; 91 // CHECK: invoke {{.*}} @_ZN2TEIiED1Ev 92 // CHECK: invoke {{.*}} @_ZN2TCIiED1Ev 93 // CHECK: call {{.*}} @_ZN2TAIiED1Ev 94} 95 96template <typename T> 97struct TF { 98 TD<T> d; 99 ~TF(); 100}; 101template <typename T> 102TF<T>::~TF() noexcept(false) {} 103 104template <typename T> 105struct TG { 106 TD<T> d; 107 ~TG(); 108}; 109template <typename T> 110TG<T>::~TG() {} 111 112template <typename T> 113struct TH { 114 TB<T> b; 115 ~TH(); 116}; 117template <typename T> 118TH<T>::~TH() {} 119 120void tinst() { 121 TF<int> f; 122 TG<int> g; 123 TH<int> h; 124} 125// CHECK: define linkonce_odr {{.*}} @_ZN2THIiED1Ev 126// CHECK: _ZTIi 127// CHECK: __cxa_call_unexpected 128 129struct VX 130{ virtual ~VX() {} }; 131 132struct VY : VX 133{ virtual ~VY() {} }; 134 135template<typename T> 136struct TVY : VX 137{ virtual ~TVY() {} }; 138 139 140struct VA { 141 B b; 142 virtual ~VA() {} 143}; 144 145struct VB : VA 146{ virtual ~VB() {} }; 147 148template<typename T> 149struct TVB : VA 150{ virtual ~TVB() {} }; 151 152void tinst2() { 153 TVY<int> tvy; 154 TVB<int> tvb; 155} 156 157template <typename T> 158struct Sw { 159 T t; 160 ~Sw() {} 161}; 162 163void tsw() { 164 Sw<int> swi; 165 Sw<B> swb; 166} 167// CHECK-NOT: define linkonce_odr {{.*}} @_ZN2SwI1BED1Ev({{.*}} # 168// CHECK: define linkonce_odr {{.*}} @_ZN2SwI1BED1Ev({{.*}} 169// CHECK: _ZTIi 170// CHECK: __cxa_call_unexpected 171// CHECK: define linkonce_odr {{.*}} @_ZN2SwIiED1Ev({{.*}} [[ATTRGRP:#[0-9]+]] 172 173template <typename T> 174struct TVC : VX 175{ virtual ~TVC(); }; 176template <typename T> 177TVC<T>::~TVC() {} 178 179// CHECK: attributes [[ATTRGRP]] = { nounwind{{.*}} } 180