blob: f3134711824d13e0c8f82929f24f72f96b69bd3e [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
Naomi Musgrave703835c2015-09-16 00:38:22 +00004// Base dtor poisons members
5// Complete dtor poisons vtable ptr after destroying members and
6// virtual bases
Naomi Musgravee50cb9b2015-08-13 18:35:11 +00007
8class Base {
9 public:
10 int x;
11 Base() {
12 x = 5;
13 }
14 virtual ~Base() {
15 x += 1;
16 }
17};
18
19class Derived : public Base {
20 public:
21 int y;
22 Derived() {
23 y = 10;
24 }
25 ~Derived() {
26 y += 1;
27 }
28};
29
30Derived d;
31
Naomi Musgrave703835c2015-09-16 00:38:22 +000032// Invoke base destructor. No vtable pointer to poison.
Naomi Musgravee50cb9b2015-08-13 18:35:11 +000033// CHECK-LABEL: define {{.*}}DerivedD1Ev
34// CHECK-NOT: call void @__sanitizer_dtor_callback
35// CHECK: call void {{.*}}DerivedD2Ev
36// CHECK-NOT: call void @__sanitizer_dtor_callback
37// CHECK: ret void
38
39// CHECK-LABEL: define {{.*}}DerivedD0Ev
40// CHECK-NOT: call void @__sanitizer_dtor_callback
41// CHECK: call void {{.*}}DerivedD1Ev
42// CHECK-NOT: call void @__sanitizer_dtor_callback
43// CHECK: ret void
44
Naomi Musgrave703835c2015-09-16 00:38:22 +000045// Invokes base destructor, and poison vtable pointer.
Naomi Musgravee50cb9b2015-08-13 18:35:11 +000046// CHECK-LABEL: define {{.*}}BaseD1Ev
47// CHECK-NOT: call void @__sanitizer_dtor_callback
48// CHECK: call void {{.*}}BaseD2Ev
49// CHECK-NOT: call void @__sanitizer_dtor_callback
50// CHECK: ret void
51
52// CHECK-LABEL: define {{.*}}BaseD0Ev
53// CHECK-NOT: call void @__sanitizer_dtor_callback
54// CHECK: call void {{.*}}BaseD1Ev
55// CHECK-NOT: call void @__sanitizer_dtor_callback
56// CHECK: ret void
57
Naomi Musgrave703835c2015-09-16 00:38:22 +000058// Poison members and vtable ptr.
Naomi Musgravee50cb9b2015-08-13 18:35:11 +000059// CHECK-LABEL: define {{.*}}BaseD2Ev
60// CHECK: call void @__sanitizer_dtor_callback
Naomi Musgrave703835c2015-09-16 00:38:22 +000061// CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8
Naomi Musgravee50cb9b2015-08-13 18:35:11 +000062// CHECK-NOT: call void @__sanitizer_dtor_callback
63// CHECK: ret void
64
Naomi Musgrave703835c2015-09-16 00:38:22 +000065// Poison members and destroy non-virtual base.
Naomi Musgravee50cb9b2015-08-13 18:35:11 +000066// CHECK-LABEL: define {{.*}}DerivedD2Ev
67// CHECK: call void @__sanitizer_dtor_callback
68// CHECK-NOT: call void @__sanitizer_dtor_callback
69// CHECK: call void {{.*}}BaseD2Ev
Naomi Musgrave703835c2015-09-16 00:38:22 +000070// CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8
Naomi Musgravee50cb9b2015-08-13 18:35:11 +000071// CHECK: ret void