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