1*bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 2*bcaeed49SFangrui Song #include "test.h" 3*bcaeed49SFangrui Song 4*bcaeed49SFangrui Song int Global; 5*bcaeed49SFangrui Song foo1()6*bcaeed49SFangrui Songvoid __attribute__((noinline)) foo1() { 7*bcaeed49SFangrui Song Global = 42; 8*bcaeed49SFangrui Song } 9*bcaeed49SFangrui Song bar1()10*bcaeed49SFangrui Songvoid __attribute__((noinline)) bar1() { 11*bcaeed49SFangrui Song volatile int tmp = 42; 12*bcaeed49SFangrui Song int tmp2 = tmp; 13*bcaeed49SFangrui Song (void)tmp2; 14*bcaeed49SFangrui Song foo1(); 15*bcaeed49SFangrui Song } 16*bcaeed49SFangrui Song foo2()17*bcaeed49SFangrui Songvoid __attribute__((noinline)) foo2() { 18*bcaeed49SFangrui Song volatile int tmp = Global; 19*bcaeed49SFangrui Song int tmp2 = tmp; 20*bcaeed49SFangrui Song (void)tmp2; 21*bcaeed49SFangrui Song } 22*bcaeed49SFangrui Song bar2()23*bcaeed49SFangrui Songvoid __attribute__((noinline)) bar2() { 24*bcaeed49SFangrui Song volatile int tmp = 42; 25*bcaeed49SFangrui Song int tmp2 = tmp; 26*bcaeed49SFangrui Song (void)tmp2; 27*bcaeed49SFangrui Song foo2(); 28*bcaeed49SFangrui Song } 29*bcaeed49SFangrui Song Thread1(void * x)30*bcaeed49SFangrui Songvoid *Thread1(void *x) { 31*bcaeed49SFangrui Song barrier_wait(&barrier); 32*bcaeed49SFangrui Song bar1(); 33*bcaeed49SFangrui Song return NULL; 34*bcaeed49SFangrui Song } 35*bcaeed49SFangrui Song main()36*bcaeed49SFangrui Songint main() { 37*bcaeed49SFangrui Song barrier_init(&barrier, 2); 38*bcaeed49SFangrui Song pthread_t t; 39*bcaeed49SFangrui Song pthread_create(&t, NULL, Thread1, NULL); 40*bcaeed49SFangrui Song bar2(); 41*bcaeed49SFangrui Song barrier_wait(&barrier); 42*bcaeed49SFangrui Song pthread_join(t, NULL); 43*bcaeed49SFangrui Song } 44*bcaeed49SFangrui Song 45*bcaeed49SFangrui Song // CHECK: WARNING: ThreadSanitizer: data race 46*bcaeed49SFangrui Song // CHECK-NEXT: Write of size 4 at {{.*}} by thread T1: 47*bcaeed49SFangrui Song // CHECK-NEXT: #0 foo1{{.*}} {{.*}}simple_stack2.cpp:[[@LINE-40]]{{(:10)?}} ({{.*}}) 48*bcaeed49SFangrui Song // CHECK-NEXT: #1 bar1{{.*}} {{.*}}simple_stack2.cpp:[[@LINE-34]]{{(:3)?}} ({{.*}}) 49*bcaeed49SFangrui Song // CHECK-NEXT: #2 Thread1{{.*}} {{.*}}simple_stack2.cpp:[[@LINE-17]]{{(:3)?}} ({{.*}}) 50*bcaeed49SFangrui Song // CHECK: Previous read of size 4 at {{.*}} by main thread: 51*bcaeed49SFangrui Song // CHECK-NEXT: #0 foo2{{.*}} {{.*}}simple_stack2.cpp:[[@LINE-33]]{{(:22)?}} ({{.*}}) 52*bcaeed49SFangrui Song // CHECK-NEXT: #1 bar2{{.*}} {{.*}}simple_stack2.cpp:[[@LINE-25]]{{(:3)?}} ({{.*}}) 53*bcaeed49SFangrui Song // CHECK-NEXT: #2 main{{.*}} {{.*}}simple_stack2.cpp:[[@LINE-13]]{{(:3)?}} ({{.*}}) 54