1// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
2#include "test.h"
3#include <semaphore.h>
4
5struct A {
6  A() {
7    sem_init(&sem_, 0, 0);
8  }
9  virtual void F() {
10  }
11  void Done() {
12    sem_post(&sem_);
13  }
14  virtual ~A() {
15    sem_wait(&sem_);
16    sem_destroy(&sem_);
17  }
18  sem_t sem_;
19};
20
21struct B : A {
22  virtual void F() {
23  }
24  virtual ~B() { }
25};
26
27static A *obj = new B;
28
29void *Thread1(void *x) {
30  obj->F();
31  barrier_wait(&barrier);
32  obj->Done();
33  return NULL;
34}
35
36void *Thread2(void *x) {
37  barrier_wait(&barrier);
38  delete obj;
39  return NULL;
40}
41
42int main() {
43  barrier_init(&barrier, 2);
44  pthread_t t[2];
45  pthread_create(&t[0], NULL, Thread1, NULL);
46  pthread_create(&t[1], NULL, Thread2, NULL);
47  pthread_join(t[0], NULL);
48  pthread_join(t[1], NULL);
49}
50
51// CHECK: WARNING: ThreadSanitizer: data race on vptr
52