blob: 723a504dd71061ffd5578439887d376c2346c5dc [file] [log] [blame]
Naomi Musgravee50cb9b2015-08-13 18:35:11 +00001// 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
7class Base {
8 public:
9 int x;
10 Base() {
11 x = 5;
12 }
13 virtual ~Base() {
14 x += 1;
15 }
16};
17
18class Derived : public Base {
19 public:
20 int y;
21 Derived() {
22 y = 10;
23 }
24 ~Derived() {
25 y += 1;
26 }
27};
28
29Derived 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