1269aa74aSDmitry Vyukov // RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 2269aa74aSDmitry Vyukov 3269aa74aSDmitry Vyukov #include "test.h" 4269aa74aSDmitry Vyukov 5269aa74aSDmitry Vyukov int *mem; 6269aa74aSDmitry Vyukov Thread(void * x)7269aa74aSDmitry Vyukovvoid *Thread(void *x) { 8269aa74aSDmitry Vyukov mem[0] = 42; 9269aa74aSDmitry Vyukov barrier_wait(&barrier); 10269aa74aSDmitry Vyukov return NULL; 11269aa74aSDmitry Vyukov } 12269aa74aSDmitry Vyukov main()13269aa74aSDmitry Vyukovint main() { 14269aa74aSDmitry Vyukov barrier_init(&barrier, 2); 15269aa74aSDmitry Vyukov mem = (int*)malloc(100); 16269aa74aSDmitry Vyukov pthread_t t; 17269aa74aSDmitry Vyukov pthread_create(&t, 0, Thread, 0); 18269aa74aSDmitry Vyukov barrier_wait(&barrier); 19269aa74aSDmitry Vyukov free(mem); 20269aa74aSDmitry Vyukov pthread_join(t, NULL); 21269aa74aSDmitry Vyukov return 0; 22269aa74aSDmitry Vyukov } 23269aa74aSDmitry Vyukov 24269aa74aSDmitry Vyukov // CHECK: WARNING: ThreadSanitizer: data race 25269aa74aSDmitry Vyukov // CHECK: Write of size 8 at {{.*}} by main thread{{.*}}: 26269aa74aSDmitry Vyukov // CHECK: #0 free 27*f5a32f5aSDmitry Vyukov // CHECK: #{{(1|2)}} main 28269aa74aSDmitry Vyukov // CHECK: Previous write of size 4 at {{.*}} by thread T1{{.*}}: 29269aa74aSDmitry Vyukov // CHECK: #0 Thread 30