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