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