1#include <pthread.h>
2#include <semaphore.h>
3#include <stdio.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  obj->Done();
32  return NULL;
33}
34
35void *Thread2(void *x) {
36  delete obj;
37  return NULL;
38}
39
40int main() {
41  pthread_t t[2];
42  pthread_create(&t[0], NULL, Thread1, NULL);
43  pthread_create(&t[1], NULL, Thread2, NULL);
44  pthread_join(t[0], NULL);
45  pthread_join(t[1], NULL);
46}
47
48// CHECK: WARNING: ThreadSanitizer: data race
49