1*67e74705SXin Li // RUN: %clang_cc1 -O0 -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 class A { 5*67e74705SXin Li public: 6*67e74705SXin Li int x; A()7*67e74705SXin Li A() {} ~A()8*67e74705SXin Li virtual ~A() {} 9*67e74705SXin Li }; 10*67e74705SXin Li A a; 11*67e74705SXin Li 12*67e74705SXin Li class B : virtual public A { 13*67e74705SXin Li public: 14*67e74705SXin Li int y; B()15*67e74705SXin Li B() {} ~B()16*67e74705SXin Li ~B() {} 17*67e74705SXin Li }; 18*67e74705SXin Li B b; 19*67e74705SXin Li 20*67e74705SXin Li // CHECK-LABEL: define {{.*}}AD1Ev 21*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 22*67e74705SXin Li // CHECK: call void {{.*}}AD2Ev 23*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 24*67e74705SXin Li // CHECK: ret void 25*67e74705SXin Li 26*67e74705SXin Li // After invoking base dtor and dtor for virtual base, poison vtable ptr. 27*67e74705SXin Li // CHECK-LABEL: define {{.*}}BD1Ev 28*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 29*67e74705SXin Li // CHECK: call void {{.*}}BD2Ev 30*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 31*67e74705SXin Li // CHECK: call void {{.*}}AD2Ev 32*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8 33*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 34*67e74705SXin Li // CHECK: ret void 35*67e74705SXin Li 36*67e74705SXin Li // Since no virtual bases, poison vtable ptr here. 37*67e74705SXin Li // CHECK-LABEL: define {{.*}}AD2Ev 38*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback 39*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8 40*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 41*67e74705SXin Li // CHECK: ret void 42*67e74705SXin Li 43*67e74705SXin Li // Poison members 44*67e74705SXin Li // CHECK-LABEL: define {{.*}}BD2Ev 45*67e74705SXin Li // CHECK: call void @__sanitizer_dtor_callback 46*67e74705SXin Li // CHECK-NOT: call void @__sanitizer_dtor_callback 47*67e74705SXin Li // CHECK: ret void 48