1*67e74705SXin Li // RUN: %clang_cc1 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-optzns -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s 2*67e74705SXin Li // RUN: %clang_cc1 -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-optzns -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s 3*67e74705SXin Li 4*67e74705SXin Li // Base dtor poisons members 5*67e74705SXin Li // Complete dtor poisons vtable ptr after destroying members and 6*67e74705SXin Li // virtual bases 7*67e74705SXin Li 8*67e74705SXin Li class Base { 9*67e74705SXin Li public: 10*67e74705SXin Li int x; Base()11*67e74705SXin Li Base() { 12*67e74705SXin Li x = 5; 13*67e74705SXin Li } ~Base()14*67e74705SXin Li virtual ~Base() { 15*67e74705SXin Li x += 1; 16*67e74705SXin Li } 17*67e74705SXin Li }; 18*67e74705SXin Li 19*67e74705SXin Li class Derived : public Base { 20*67e74705SXin Li public: 21*67e74705SXin Li int y; Derived()22*67e74705SXin Li Derived() { 23*67e74705SXin Li y = 10; 24*67e74705SXin Li } ~Derived()25*67e74705SXin Li ~Derived() { 26*67e74705SXin Li y += 1; 27*67e74705SXin Li } 28*67e74705SXin Li }; 29*67e74705SXin Li 30*67e74705SXin Li Derived d; 31*67e74705SXin Li 32*67e74705SXin Li // Invoke base destructor. No vtable pointer to poison. 33*67e74705SXin Li // CHECK-LABEL: define {{.*}}DerivedD1Ev 34*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 35*67e74705SXin Li // CHECK: call void {{.*}}DerivedD2Ev 36*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 37*67e74705SXin Li // CHECK: ret void 38*67e74705SXin Li 39*67e74705SXin Li // CHECK-LABEL: define {{.*}}DerivedD0Ev 40*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 41*67e74705SXin Li // CHECK: call void {{.*}}DerivedD1Ev 42*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 43*67e74705SXin Li // CHECK: ret void 44*67e74705SXin Li 45*67e74705SXin Li // Invokes base destructor, and poison vtable pointer. 46*67e74705SXin Li // CHECK-LABEL: define {{.*}}BaseD1Ev 47*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 48*67e74705SXin Li // CHECK: call void {{.*}}BaseD2Ev 49*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 50*67e74705SXin Li // CHECK: ret void 51*67e74705SXin Li 52*67e74705SXin Li // CHECK-LABEL: define {{.*}}BaseD0Ev 53*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 54*67e74705SXin Li // CHECK: call void {{.*}}BaseD1Ev 55*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 56*67e74705SXin Li // CHECK: ret void 57*67e74705SXin Li 58*67e74705SXin Li // Poison members and vtable ptr. 59*67e74705SXin Li // CHECK-LABEL: define {{.*}}BaseD2Ev 60*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback 61*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8 62*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 63*67e74705SXin Li // CHECK: ret void 64*67e74705SXin Li 65*67e74705SXin Li // Poison members and destroy non-virtual base. 66*67e74705SXin Li // CHECK-LABEL: define {{.*}}DerivedD2Ev 67*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback 68*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 69*67e74705SXin Li // CHECK: call void {{.*}}BaseD2Ev 70*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8 71*67e74705SXin Li // CHECK: ret void 72