xref: /aosp_15_r20/external/clang/test/CodeGenCXX/virtual-destructor-calls.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li B::~B() { }
34*67e74705SXin Li 
35*67e74705SXin Li struct C : B {
36*67e74705SXin Li   ~C();
37*67e74705SXin Li };
38*67e74705SXin Li 
~C()39*67e74705SXin Li C::~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