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