1*dcc6db22SDmitry Vyukov // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 2*dcc6db22SDmitry Vyukov #include "test.h" 3*dcc6db22SDmitry Vyukov 4*dcc6db22SDmitry Vyukov volatile long X; 5*dcc6db22SDmitry Vyukov volatile long Y; 6*dcc6db22SDmitry Vyukov volatile int N1 = 2 << 10; 7*dcc6db22SDmitry Vyukov volatile int N2 = 32 << 10; 8*dcc6db22SDmitry Vyukov void (*volatile F)(); 9*dcc6db22SDmitry Vyukov void (*volatile G)(); 10*dcc6db22SDmitry Vyukov foo()11*dcc6db22SDmitry Vyukovstatic void foo() { 12*dcc6db22SDmitry Vyukov if (--N1) 13*dcc6db22SDmitry Vyukov return F(); 14*dcc6db22SDmitry Vyukov while (--N2) 15*dcc6db22SDmitry Vyukov G(); 16*dcc6db22SDmitry Vyukov } 17*dcc6db22SDmitry Vyukov bar()18*dcc6db22SDmitry Vyukovstatic void bar() { Y++; } 19*dcc6db22SDmitry Vyukov Thread(void * p)20*dcc6db22SDmitry Vyukovvoid *Thread(void *p) { 21*dcc6db22SDmitry Vyukov F(); 22*dcc6db22SDmitry Vyukov X = 43; 23*dcc6db22SDmitry Vyukov barrier_wait(&barrier); 24*dcc6db22SDmitry Vyukov return 0; 25*dcc6db22SDmitry Vyukov } 26*dcc6db22SDmitry Vyukov main()27*dcc6db22SDmitry Vyukovint main() { 28*dcc6db22SDmitry Vyukov barrier_init(&barrier, 2); 29*dcc6db22SDmitry Vyukov F = foo; 30*dcc6db22SDmitry Vyukov G = bar; 31*dcc6db22SDmitry Vyukov pthread_t t; 32*dcc6db22SDmitry Vyukov pthread_create(&t, 0, Thread, 0); 33*dcc6db22SDmitry Vyukov barrier_wait(&barrier); 34*dcc6db22SDmitry Vyukov X = 43; 35*dcc6db22SDmitry Vyukov pthread_join(t, 0); 36*dcc6db22SDmitry Vyukov } 37*dcc6db22SDmitry Vyukov 38*dcc6db22SDmitry Vyukov // CHECK: WARNING: ThreadSanitizer: data race 39*dcc6db22SDmitry Vyukov // CHECK: Write 40*dcc6db22SDmitry Vyukov // CHECK: #0 main 41*dcc6db22SDmitry Vyukov // CHECK: Previous write 42*dcc6db22SDmitry Vyukov // CHECK: #0 Thread 43