1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-win32 -fno-rtti -mconstructor-aliases -O1 -disable-llvm-optzns | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li namespace test1 { 4*67e74705SXin Li template <typename T> class A { ~A()5*67e74705SXin Li ~A() {} 6*67e74705SXin Li }; 7*67e74705SXin Li template class A<char>; 8*67e74705SXin Li // CHECK-DAG: define weak_odr x86_thiscallcc void @"\01??1?$A@D@test1@@AAE@XZ" 9*67e74705SXin Li } 10*67e74705SXin Li 11*67e74705SXin Li namespace test2 { 12*67e74705SXin Li struct A { 13*67e74705SXin Li virtual ~A(); 14*67e74705SXin Li }; 15*67e74705SXin Li struct B : A { 16*67e74705SXin Li B(); 17*67e74705SXin Li virtual ~B(); 18*67e74705SXin Li }; 19*67e74705SXin Li ~A()20*67e74705SXin LiA::~A() {} ~B()21*67e74705SXin LiB::~B() {} foo()22*67e74705SXin Livoid foo() { 23*67e74705SXin Li B b; 24*67e74705SXin Li } 25*67e74705SXin Li // CHECK-DAG: @"\01??1B@test2@@UAE@XZ" = alias void (%"struct.test2::B"*), bitcast (void (%"struct.test2::A"*)* @"\01??1A@test2@@UAE@XZ" to void (%"struct.test2::B"*)*) 26*67e74705SXin Li } 27*67e74705SXin Li 28*67e74705SXin Li namespace test3 { 29*67e74705SXin Li struct A { virtual ~A(); }; ~A()30*67e74705SXin LiA::~A() {} 31*67e74705SXin Li } 32*67e74705SXin Li // CHECK-DAG: define x86_thiscallcc void @"\01??1A@test3@@UAE@XZ"( 33*67e74705SXin Li namespace test3 { 34*67e74705SXin Li template <typename T> 35*67e74705SXin Li struct B : A { ~Btest3::B36*67e74705SXin Li virtual ~B() { } 37*67e74705SXin Li }; 38*67e74705SXin Li template struct B<int>; 39*67e74705SXin Li } 40*67e74705SXin Li // This has to be weak, and emitting weak aliases is fragile, so we don't do the 41*67e74705SXin Li // aliasing. 42*67e74705SXin Li // CHECK-DAG: define weak_odr x86_thiscallcc void @"\01??1?$B@H@test3@@UAE@XZ"( 43