1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s
20ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
30ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct A {
40ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~A();
50ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
60ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
70ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct B {
80ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~B() throw(int);
90ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
100ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
110ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct C {
120ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  B b;
130ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~C() {}
140ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
150ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
160ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct D {
170ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~D() noexcept(false);
180ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
190ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
200ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct E {
210ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  D d;
220ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~E() {}
230ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
240ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
250ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlvoid foo() {
260ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  A a;
270ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  C c;
280ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  E e;
292e283f00fe9502150cf41bb1db70a5cd16693794Eli Friedman  // CHECK: invoke {{.*}} @_ZN1ED1Ev
302e283f00fe9502150cf41bb1db70a5cd16693794Eli Friedman  // CHECK: invoke {{.*}} @_ZN1CD1Ev
312e283f00fe9502150cf41bb1db70a5cd16693794Eli Friedman  // CHECK: call {{.*}} @_ZN1AD1Ev
320ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl}
330ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
340ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct F {
350ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  D d;
360ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~F();
370ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
380ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian RedlF::~F() noexcept(false) {}
390ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
400ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct G {
410ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  D d;
420ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~G();
430ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
440ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian RedlG::~G() {}
450ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
460ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct H {
470ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  B b;
480ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~H();
490ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
500ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian RedlH::~H() throw(int) {}
510ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
520ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct I {
530ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  B b;
540ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~I();
550ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
560ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian RedlI::~I() {}
570ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
580ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl// Template variants.
590ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
600ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redltemplate <typename T>
610ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct TA {
620ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~TA();
630ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
640ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
650ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redltemplate <typename T>
660ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct TB {
670ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~TB() throw(int);
680ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
690ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
700ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redltemplate <typename T>
710ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct TC {
720ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  TB<T> b;
730ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~TC() {}
740ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
750ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
760ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redltemplate <typename T>
770ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct TD {
780ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~TD() noexcept(false);
790ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
800ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
810ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redltemplate <typename T>
820ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct TE {
830ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  TD<T> d;
840ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~TE() {}
850ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
860ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
870ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlvoid tfoo() {
880ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  TA<int> a;
890ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  TC<int> c;
900ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  TE<int> e;
912e283f00fe9502150cf41bb1db70a5cd16693794Eli Friedman  // CHECK: invoke {{.*}} @_ZN2TEIiED1Ev
922e283f00fe9502150cf41bb1db70a5cd16693794Eli Friedman  // CHECK: invoke {{.*}} @_ZN2TCIiED1Ev
932e283f00fe9502150cf41bb1db70a5cd16693794Eli Friedman  // CHECK: call {{.*}} @_ZN2TAIiED1Ev
940ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl}
950ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
960ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redltemplate <typename T>
970ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct TF {
980ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  TD<T> d;
990ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~TF();
1000ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
1010ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redltemplate <typename T>
1020ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian RedlTF<T>::~TF() noexcept(false) {}
1030ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
1040ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redltemplate <typename T>
1050ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct TG {
1060ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  TD<T> d;
1070ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~TG();
1080ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
1090ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redltemplate <typename T>
1100ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian RedlTG<T>::~TG() {}
1110ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
1120ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redltemplate <typename T>
1130ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct TH {
1140ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  TB<T> b;
1150ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  ~TH();
1160ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
1170ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redltemplate <typename T>
1180ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian RedlTH<T>::~TH() {}
1190ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
1200ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlvoid tinst() {
1210ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  TF<int> f;
1220ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  TG<int> g;
1230ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  TH<int> h;
1240ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl}
1252e283f00fe9502150cf41bb1db70a5cd16693794Eli Friedman// CHECK: define linkonce_odr {{.*}} @_ZN2THIiED1Ev
1260ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl// CHECK: _ZTIi
1270ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl// CHECK: __cxa_call_unexpected
1280ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
1290ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct VX
1300ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl{ virtual ~VX() {} };
1310ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
1320ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct VY : VX
1330ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl{ virtual ~VY() {} };
1340ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
13542bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redltemplate<typename T>
13642bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redlstruct TVY : VX
13742bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl{ virtual ~TVY() {} };
13842bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl
1390ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
1400ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct VA {
1410ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  B b;
1420ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl  virtual ~VA() {}
1430ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl};
1440ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl
1450ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redlstruct VB : VA
1460ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl{ virtual ~VB() {} };
14742bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl
14842bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redltemplate<typename T>
14942bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redlstruct TVB : VA
15042bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl{ virtual ~TVB() {} };
15142bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl
15242bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redlvoid tinst2() {
15342bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl  TVY<int> tvy;
15442bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl  TVB<int> tvb;
15542bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl}
15642bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl
15742bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redltemplate <typename T>
15842bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redlstruct Sw {
15942bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl  T t;
16042bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl  ~Sw() {}
16142bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl};
16242bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl
16342bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redlvoid tsw() {
16442bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl  Sw<int> swi;
16542bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl  Sw<B> swb;
16642bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl}
1672e283f00fe9502150cf41bb1db70a5cd16693794Eli Friedman// CHECK-NOT: define linkonce_odr {{.*}} @_ZN2SwI1BED1Ev({{.*}} nounwind
1682e283f00fe9502150cf41bb1db70a5cd16693794Eli Friedman// CHECK: define linkonce_odr {{.*}} @_ZN2SwI1BED1Ev({{.*}}
16942bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl// CHECK: _ZTIi
17042bef03a0f0462a95eb66b9e63feab0bf596134dSebastian Redl// CHECK: __cxa_call_unexpected
1712e283f00fe9502150cf41bb1db70a5cd16693794Eli Friedman// CHECK: define linkonce_odr {{.*}} @_ZN2SwIiED1Ev({{.*}} nounwind
172a0448264c7da395ca9416c6570bc43a7f49e436bSebastian Redl
173a0448264c7da395ca9416c6570bc43a7f49e436bSebastian Redltemplate <typename T>
174a0448264c7da395ca9416c6570bc43a7f49e436bSebastian Redlstruct TVC : VX
175a0448264c7da395ca9416c6570bc43a7f49e436bSebastian Redl{ virtual ~TVC(); };
176a0448264c7da395ca9416c6570bc43a7f49e436bSebastian Redltemplate <typename T>
177a0448264c7da395ca9416c6570bc43a7f49e436bSebastian RedlTVC<T>::~TVC() {}
178