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