blob: 2318ef0d80032204326064f0a5da7d7702683efa [file] [log] [blame]
Chandler Carruth93786da2016-12-23 00:23:01 +00001// RUN: %clang_cc1 -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-passes -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-passes -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
Naomi Musgrave703835c2015-09-16 00:38:22 +00003
4class A {
5 public:
6 int x;
7 A() {}
8 virtual ~A() {}
9};
10A a;
11
12class B : virtual public A {
13 public:
14 int y;
15 B() {}
16 ~B() {}
17};
18B b;
19
20// CHECK-LABEL: define {{.*}}AD1Ev
21// CHECK-NOT: call void @__sanitizer_dtor_callback
22// CHECK: call void {{.*}}AD2Ev
23// CHECK-NOT: call void @__sanitizer_dtor_callback
24// CHECK: ret void
25
26// After invoking base dtor and dtor for virtual base, poison vtable ptr.
27// CHECK-LABEL: define {{.*}}BD1Ev
28// CHECK-NOT: call void @__sanitizer_dtor_callback
29// CHECK: call void {{.*}}BD2Ev
30// CHECK-NOT: call void @__sanitizer_dtor_callback
31// CHECK: call void {{.*}}AD2Ev
32// CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8
33// CHECK-NOT: call void @__sanitizer_dtor_callback
34// CHECK: ret void
35
36// Since no virtual bases, poison vtable ptr here.
37// CHECK-LABEL: define {{.*}}AD2Ev
38// CHECK: call void @__sanitizer_dtor_callback
39// CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8
40// CHECK-NOT: call void @__sanitizer_dtor_callback
41// CHECK: ret void
42
43// Poison members
44// CHECK-LABEL: define {{.*}}BD2Ev
45// CHECK: call void @__sanitizer_dtor_callback
46// CHECK-NOT: call void @__sanitizer_dtor_callback
47// CHECK: ret void