1 // 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 // 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 4 // Only the last dtor of a class invokes the sanitizing callback 5 // Sanitizing callback emited prior to base class dtor invocations 6 7 class Base { 8 public: 9 int x; 10 Base() { 11 x = 5; 12 } 13 virtual ~Base() { 14 x += 1; 15 } 16 }; 17 18 class Derived : public Base { 19 public: 20 int y; 21 Derived() { 22 y = 10; 23 } 24 ~Derived() { 25 y += 1; 26 } 27 }; 28 29 Derived d; 30 31 // CHECK-LABEL: define {{.*}}DerivedD1Ev 32 // CHECK-NOT: call void @__sanitizer_dtor_callback 33 // CHECK: call void {{.*}}DerivedD2Ev 34 // CHECK-NOT: call void @__sanitizer_dtor_callback 35 // CHECK: ret void 36 37 // CHECK-LABEL: define {{.*}}DerivedD0Ev 38 // CHECK-NOT: call void @__sanitizer_dtor_callback 39 // CHECK: call void {{.*}}DerivedD1Ev 40 // CHECK-NOT: call void @__sanitizer_dtor_callback 41 // CHECK: ret void 42 43 // CHECK-LABEL: define {{.*}}BaseD1Ev 44 // CHECK-NOT: call void @__sanitizer_dtor_callback 45 // CHECK: call void {{.*}}BaseD2Ev 46 // CHECK-NOT: call void @__sanitizer_dtor_callback 47 // CHECK: ret void 48 49 // CHECK-LABEL: define {{.*}}BaseD0Ev 50 // CHECK-NOT: call void @__sanitizer_dtor_callback 51 // CHECK: call void {{.*}}BaseD1Ev 52 // CHECK-NOT: call void @__sanitizer_dtor_callback 53 // CHECK: ret void 54 55 // CHECK-LABEL: define {{.*}}BaseD2Ev 56 // CHECK: call void @__sanitizer_dtor_callback 57 // CHECK-NOT: call void @__sanitizer_dtor_callback 58 // CHECK: ret void 59 60 // CHECK-LABEL: define {{.*}}DerivedD2Ev 61 // CHECK: call void @__sanitizer_dtor_callback 62 // CHECK-NOT: call void @__sanitizer_dtor_callback 63 // CHECK: call void {{.*}}BaseD2Ev 64 // CHECK-NOT: call void @__sanitizer_dtor_callback 65 // CHECK: ret void 66