1 // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
2 #include "test.h"
3 
4 struct A {
FA5   virtual void F() {
6   }
7 
~AA8   virtual ~A() {
9   }
10 };
11 
12 struct B : A {
FB13   virtual void F() {
14   }
15 };
16 
Thread(void * x)17 void *Thread(void *x) {
18   barrier_wait(&barrier);
19   ((A*)x)->F();
20   return 0;
21 }
22 
main()23 int main() {
24   barrier_init(&barrier, 2);
25   A *obj = new B;
26   pthread_t t;
27   pthread_create(&t, 0, Thread, obj);
28   delete obj;
29   barrier_wait(&barrier);
30   pthread_join(t, 0);
31 }
32 
33 // CHECK: WARNING: ThreadSanitizer: heap-use-after-free (virtual call vs free)
34 
35