1 // 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 // 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 4 template <class T> 5 class Vector { 6 public: 7 int size; 8 ~Vector() { 9 size += 1; 10 } 11 }; 12 13 struct Base { 14 int b1; 15 double b2; 16 Base() { 17 b1 = 5; 18 b2 = 10.989; 19 } 20 virtual ~Base() {} 21 }; 22 23 struct VirtualBase { 24 int vb1; 25 int vb2; 26 VirtualBase() { 27 vb1 = 10; 28 vb2 = 11; 29 } 30 virtual ~VirtualBase() {} 31 }; 32 33 struct Derived : public Base, public virtual VirtualBase { 34 int d1; 35 Vector<int> v; 36 int d2; 37 Derived() { 38 d1 = 10; 39 } 40 ~Derived() {} 41 }; 42 43 Derived d; 44 45 // Destruction order: 46 // Derived: int, Vector, Base, VirtualBase 47 48 // CHECK-LABEL: define {{.*}}ZN7DerivedD1Ev 49 // CHECK: call void {{.*}}ZN11VirtualBaseD2Ev 50 // CHECK: ret void 51 52 // CHECK-LABEL: define {{.*}}ZN7DerivedD0Ev 53 // CHECK: ret void 54 55 // CHECK-LABEL: define {{.*}}ZN11VirtualBaseD1Ev 56 // CHECK: ret void 57 58 // CHECK-LABEL: define {{.*}}ZN11VirtualBaseD0Ev 59 // CHECK: ret void 60 61 // poison 2 ints 62 // CHECK-LABEL: define {{.*}}ZN11VirtualBaseD2Ev 63 // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 8) 64 // CHECK: ret void 65 66 // poison int and double 67 // CHECK-LABEL: define {{.*}}ZN4BaseD2Ev 68 // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 16) 69 // CHECK: ret void 70 71 // poison int, ignore vector, poison int 72 // CHECK-LABEL: define {{.*}}ZN7DerivedD2Ev 73 // CHECK: call void {{.*}}ZN6VectorIiED1Ev 74 // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 4) 75 // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 4) 76 // CHECK: call void {{.*}}ZN4BaseD2Ev 77 // CHECK: ret void 78 79 // poison int 80 // CHECK-LABEL: define {{.*}}ZN6VectorIiED2Ev 81 // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 4) 82 // CHECK: ret void 83