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