1*7c3d14c8STreehugger Robot // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 2*7c3d14c8STreehugger Robot #include <pthread.h> 3*7c3d14c8STreehugger Robot 4*7c3d14c8STreehugger Robot volatile int N; // Prevent loop unrolling. 5*7c3d14c8STreehugger Robot int **data; 6*7c3d14c8STreehugger Robot Thread1(void * x)7*7c3d14c8STreehugger Robotvoid *Thread1(void *x) { 8*7c3d14c8STreehugger Robot for (int i = 0; i < N; i++) 9*7c3d14c8STreehugger Robot data[i][0] = 42; 10*7c3d14c8STreehugger Robot return 0; 11*7c3d14c8STreehugger Robot } 12*7c3d14c8STreehugger Robot main()13*7c3d14c8STreehugger Robotint main() { 14*7c3d14c8STreehugger Robot N = 4; 15*7c3d14c8STreehugger Robot data = new int*[N]; 16*7c3d14c8STreehugger Robot for (int i = 0; i < N; i++) 17*7c3d14c8STreehugger Robot data[i] = new int; 18*7c3d14c8STreehugger Robot pthread_t t; 19*7c3d14c8STreehugger Robot pthread_create(&t, 0, Thread1, 0); 20*7c3d14c8STreehugger Robot Thread1(0); 21*7c3d14c8STreehugger Robot pthread_join(t, 0); 22*7c3d14c8STreehugger Robot for (int i = 0; i < N; i++) 23*7c3d14c8STreehugger Robot delete data[i]; 24*7c3d14c8STreehugger Robot delete[] data; 25*7c3d14c8STreehugger Robot } 26*7c3d14c8STreehugger Robot 27*7c3d14c8STreehugger Robot // CHECK: ThreadSanitizer: reported 1 warnings 28