Index: test/msan/dtor-derived-class.cc =================================================================== --- /dev/null +++ test/msan/dtor-derived-class.cc @@ -0,0 +1,55 @@ +// RUN: %clangxx_msan %s -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 +// RUN: FileCheck %s < %t.out + +// RUN: %clangxx_msan %s -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 +// RUN: FileCheck %s < %t.out + +// RUN: %clangxx_msan %s -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 +// RUN: FileCheck %s < %t.out + +#include +#include + +struct Base { + int x_; + Base() { + x_ = 5; + } + virtual ~Base() { } +}; + +struct Derived:public Base { + int y_; + Derived() { + y_ = 10; + } + ~Derived() { } +}; + +int main() { + Derived d; + d.~Derived(); + + if (__msan_test_shadow(&d, sizeof(d)) != -1) + printf("d is poisoned\n"); + else + printf("d is not poisoned\n"); + // CHECK: d is poisoned + + Base *b = new Derived(); + b->~Base(); + + if (__msan_test_shadow(b, sizeof(*b)) != -1) + printf("b is poisoned\n"); + else + printf("b is not poisoned\n"); + // CHECK: b is poisoned + + if (__msan_test_shadow(&b, sizeof(b)) != -1) + printf("*b is poisoned\n"); + else + printf("*b is not poisoned\n"); + // CHECK: *b is not poisoned + + return 0; +}