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