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