15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clang_tsan -O1 %s -o %t && TSAN_OPTIONS="$TSAN_OPTIONS halt_on_error=1" %deflake %run %t | FileCheck %s
2dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov#include <pthread.h>
3dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov#include <stdio.h>
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <unistd.h>
5dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov
6dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukovint X;
7dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov
8dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukovvoid *Thread(void *x) {
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  sleep(1);
10dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov  X = 42;
11dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov  return 0;
12dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov}
13dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov
14dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukovint main() {
15dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov  fprintf(stderr, "BEFORE\n");
16dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov  pthread_t t;
17dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov  pthread_create(&t, 0, Thread, 0);
18dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov  X = 43;
19dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov  pthread_join(t, 0);
20dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov  fprintf(stderr, "AFTER\n");
21dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov  return 0;
22dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov}
23dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov
24dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov// CHECK: BEFORE
25dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov// CHECK: WARNING: ThreadSanitizer: data race
26dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov// CHECK-NOT: AFTER
27dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov
28