13d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// RUN: %clangxx_msan %s -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 23d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 33d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// 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 43d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 53d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// 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 63d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 73d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// TODO Success pending on resolution of 83d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// https://github.com/google/sanitizers/issues/596 93d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 103d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// XFAIL: * 113d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 123d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#include <assert.h> 133d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#include <sanitizer/msan_interface.h> 143d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 153d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainartemplate <class T> class Vector { 163d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar public: 173d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar int size; 183d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar ~Vector() {} 193d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar}; 203d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 213d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarstruct NonTrivial { 223d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar int a; 233d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar Vector<int> v; 243d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar}; 253d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 263d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarstruct Trivial { 273d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar int a; 283d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar int b; 293d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar}; 303d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 313d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarint main() { 323d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar NonTrivial *nt = new NonTrivial(); 333d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar nt->~NonTrivial(); 343d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar assert(__msan_test_shadow(nt, sizeof(*nt)) != -1); 353d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 363d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar Trivial *t = new Trivial(); 373d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar t->~Trivial(); 383d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar assert(__msan_test_shadow(t, sizeof(*t)) != -1); 393d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 403d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return 0; 413d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 42