xref: /aosp_15_r20/external/clang/test/CodeGenCXX/sanitize-dtor-nontrivial-virtual-base.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsanitize=memory -O0 -fsanitize-memory-use-after-dtor -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -fsanitize=memory -O1 -fsanitize-memory-use-after-dtor -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
3*67e74705SXin Li 
4*67e74705SXin Li template <class T>
5*67e74705SXin Li class Vector {
6*67e74705SXin Li public:
7*67e74705SXin Li   int size;
~Vector()8*67e74705SXin Li   ~Vector() {
9*67e74705SXin Li     size += 1;
10*67e74705SXin Li   }
11*67e74705SXin Li };
12*67e74705SXin Li 
13*67e74705SXin Li struct Base {
14*67e74705SXin Li   int b1;
15*67e74705SXin Li   double b2;
BaseBase16*67e74705SXin Li   Base() {
17*67e74705SXin Li     b1 = 5;
18*67e74705SXin Li     b2 = 10.989;
19*67e74705SXin Li   }
~BaseBase20*67e74705SXin Li   virtual ~Base() {}
21*67e74705SXin Li };
22*67e74705SXin Li 
23*67e74705SXin Li struct VirtualBase {
24*67e74705SXin Li   int vb1;
25*67e74705SXin Li   int vb2;
VirtualBaseVirtualBase26*67e74705SXin Li   VirtualBase() {
27*67e74705SXin Li     vb1 = 10;
28*67e74705SXin Li     vb2 = 11;
29*67e74705SXin Li   }
~VirtualBaseVirtualBase30*67e74705SXin Li   virtual ~VirtualBase() {}
31*67e74705SXin Li };
32*67e74705SXin Li 
33*67e74705SXin Li struct Derived : public Base, public virtual VirtualBase {
34*67e74705SXin Li   int d1;
35*67e74705SXin Li   Vector<int> v;
36*67e74705SXin Li   int d2;
DerivedDerived37*67e74705SXin Li   Derived() {
38*67e74705SXin Li     d1 = 10;
39*67e74705SXin Li   }
~DerivedDerived40*67e74705SXin Li   ~Derived() {}
41*67e74705SXin Li };
42*67e74705SXin Li 
43*67e74705SXin Li Derived d;
44*67e74705SXin Li 
45*67e74705SXin Li // Destruction order:
46*67e74705SXin Li // Derived: int, Vector, Base, VirtualBase
47*67e74705SXin Li 
48*67e74705SXin Li // CHECK-LABEL: define {{.*}}ZN7DerivedD1Ev
49*67e74705SXin Li // CHECK: call void {{.*}}ZN11VirtualBaseD2Ev
50*67e74705SXin Li // CHECK: ret void
51*67e74705SXin Li 
52*67e74705SXin Li // CHECK-LABEL: define {{.*}}ZN7DerivedD0Ev
53*67e74705SXin Li // CHECK: ret void
54*67e74705SXin Li 
55*67e74705SXin Li // CHECK-LABEL: define {{.*}}ZN11VirtualBaseD1Ev
56*67e74705SXin Li // CHECK: ret void
57*67e74705SXin Li 
58*67e74705SXin Li // CHECK-LABEL: define {{.*}}ZN11VirtualBaseD0Ev
59*67e74705SXin Li // CHECK: ret void
60*67e74705SXin Li 
61*67e74705SXin Li // poison 2 ints
62*67e74705SXin Li // CHECK-LABEL: define {{.*}}ZN11VirtualBaseD2Ev
63*67e74705SXin Li // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 8)
64*67e74705SXin Li // CHECK: ret void
65*67e74705SXin Li 
66*67e74705SXin Li // poison int and double
67*67e74705SXin Li // CHECK-LABEL: define {{.*}}ZN4BaseD2Ev
68*67e74705SXin Li // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 16)
69*67e74705SXin Li // CHECK: ret void
70*67e74705SXin Li 
71*67e74705SXin Li // poison int, ignore vector, poison int
72*67e74705SXin Li // CHECK-LABEL: define {{.*}}ZN7DerivedD2Ev
73*67e74705SXin Li // CHECK: call void {{.*}}ZN6VectorIiED1Ev
74*67e74705SXin Li // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 4)
75*67e74705SXin Li // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 4)
76*67e74705SXin Li // CHECK: call void {{.*}}ZN4BaseD2Ev
77*67e74705SXin Li // CHECK: ret void
78*67e74705SXin Li 
79*67e74705SXin Li // poison int
80*67e74705SXin Li // CHECK-LABEL: define {{.*}}ZN6VectorIiED2Ev
81*67e74705SXin Li // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 4)
82*67e74705SXin Li // CHECK: ret void
83