1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin10 -mconstructor-aliases -O1 -disable-llvm-optzns | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li struct Member { 4*67e74705SXin Li ~Member(); 5*67e74705SXin Li }; 6*67e74705SXin Li 7*67e74705SXin Li struct A { 8*67e74705SXin Li virtual ~A(); 9*67e74705SXin Li }; 10*67e74705SXin Li 11*67e74705SXin Li struct B : A { 12*67e74705SXin Li Member m; 13*67e74705SXin Li virtual ~B(); 14*67e74705SXin Li }; 15*67e74705SXin Li 16*67e74705SXin Li // Complete dtor: just an alias because there are no virtual bases. 17*67e74705SXin Li // CHECK: @_ZN1BD1Ev = alias {{.*}} @_ZN1BD2Ev 18*67e74705SXin Li 19*67e74705SXin Li // (aliases from C) 20*67e74705SXin Li // CHECK: @_ZN1CD2Ev = alias {{.*}}, bitcast {{.*}} @_ZN1BD2Ev 21*67e74705SXin Li // CHECK: @_ZN1CD1Ev = alias {{.*}} @_ZN1CD2Ev 22*67e74705SXin Li 23*67e74705SXin Li // Base dtor: actually calls A's base dtor. 24*67e74705SXin Li // CHECK-LABEL: define void @_ZN1BD2Ev(%struct.B* %this) unnamed_addr 25*67e74705SXin Li // CHECK: call void @_ZN6MemberD1Ev 26*67e74705SXin Li // CHECK: call void @_ZN1AD2Ev 27*67e74705SXin Li 28*67e74705SXin Li // Deleting dtor: defers to the complete dtor. 29*67e74705SXin Li // CHECK-LABEL: define void @_ZN1BD0Ev(%struct.B* %this) unnamed_addr 30*67e74705SXin Li // CHECK: call void @_ZN1BD1Ev 31*67e74705SXin Li // CHECK: call void @_ZdlPv 32*67e74705SXin Li ~B()33*67e74705SXin LiB::~B() { } 34*67e74705SXin Li 35*67e74705SXin Li struct C : B { 36*67e74705SXin Li ~C(); 37*67e74705SXin Li }; 38*67e74705SXin Li ~C()39*67e74705SXin LiC::~C() { } 40*67e74705SXin Li 41*67e74705SXin Li // Complete dtor: just an alias (checked above). 42*67e74705SXin Li 43*67e74705SXin Li // Deleting dtor: defers to the complete dtor. 44*67e74705SXin Li // CHECK-LABEL: define void @_ZN1CD0Ev(%struct.C* %this) unnamed_addr 45*67e74705SXin Li // CHECK: call void @_ZN1CD1Ev 46*67e74705SXin Li // CHECK: call void @_ZdlPv 47*67e74705SXin Li 48*67e74705SXin Li // Base dtor: just an alias to B's base dtor. 49*67e74705SXin Li 50*67e74705SXin Li namespace PR12798 { 51*67e74705SXin Li // A qualified call to a base class destructor should not undergo virtual 52*67e74705SXin Li // dispatch. Template instantiation used to lose the qualifier. 53*67e74705SXin Li struct A { virtual ~A(); }; f(T * p)54*67e74705SXin Li template<typename T> void f(T *p) { p->A::~A(); } 55*67e74705SXin Li 56*67e74705SXin Li // CHECK: define {{.*}} @_ZN7PR127981fINS_1AEEEvPT_( 57*67e74705SXin Li // CHECK: call void @_ZN7PR127981AD1Ev( 58*67e74705SXin Li template void f(A*); 59*67e74705SXin Li } 60