60 lines · cpp
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin10 -mconstructor-aliases -O1 -disable-llvm-passes | FileCheck %s2 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 ={{.*}} unnamed_addr alias {{.*}} @_ZN1BD2Ev18 19// (aliases from C)20// CHECK: @_ZN1CD2Ev ={{.*}} unnamed_addr alias {{.*}} @_ZN1BD2Ev21// CHECK: @_ZN1CD1Ev ={{.*}} unnamed_addr alias {{.*}} @_ZN1CD2Ev22 23// Base dtor: actually calls A's base dtor.24// CHECK-LABEL: define{{.*}} void @_ZN1BD2Ev(ptr {{[^,]*}} %this) unnamed_addr25// CHECK: call void @_ZN6MemberD1Ev26// CHECK: call void @_ZN1AD2Ev27 28// Deleting dtor: defers to the complete dtor.29// CHECK-LABEL: define{{.*}} void @_ZN1BD0Ev(ptr {{[^,]*}} %this) unnamed_addr30// CHECK: call void @_ZN1BD1Ev31// CHECK: call void @_ZdlPv32 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(ptr {{[^,]*}} %this) unnamed_addr45// CHECK: call void @_ZN1CD1Ev46// CHECK: call void @_ZdlPv47 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 virtual52 // 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