12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
2ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov#include <pthread.h>
3ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov#include <stdlib.h>
4ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov#include <stdio.h>
5ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov#include <unistd.h>
6ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov
7ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukovextern "C" {
8ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukovvoid AnnotateIgnoreReadsBegin(const char *f, int l);
9ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukovvoid AnnotateIgnoreReadsEnd(const char *f, int l);
10ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukovvoid AnnotateIgnoreWritesBegin(const char *f, int l);
11ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukovvoid AnnotateIgnoreWritesEnd(const char *f, int l);
12ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov}
13ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov
14ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukovvoid *Thread(void *p) {
15ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  *(int*)p = 42;
16ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  return 0;
17ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov}
18ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov
19ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukovint main() {
20ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  int *p = new int(0);
21ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  pthread_t t;
22ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  pthread_create(&t, 0, Thread, p);
23ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  sleep(1);
24ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  AnnotateIgnoreReadsBegin(__FILE__, __LINE__);
25ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  AnnotateIgnoreWritesBegin(__FILE__, __LINE__);
26ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  free(p);
27ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  AnnotateIgnoreReadsEnd(__FILE__, __LINE__);
28ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  AnnotateIgnoreWritesEnd(__FILE__, __LINE__);
29ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  pthread_join(t, 0);
30ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  fprintf(stderr, "OK\n");
31ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov  return 0;
32ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov}
33ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov
34ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov// CHECK-NOT: WARNING: ThreadSanitizer: data race
35ff90a95c26198e9e794e186365a62511439e0ca0Dmitry Vyukov// CHECK: OK
36