1*2d9bdd9dSMatt Kulukundis // RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s 2*2d9bdd9dSMatt Kulukundis #include <pthread.h> 3*2d9bdd9dSMatt Kulukundis #include <stdio.h> 4*2d9bdd9dSMatt Kulukundis #include <stdlib.h> 5*2d9bdd9dSMatt Kulukundis 6*2d9bdd9dSMatt Kulukundis struct P { 7*2d9bdd9dSMatt Kulukundis int x; 8*2d9bdd9dSMatt Kulukundis int y; 9*2d9bdd9dSMatt Kulukundis }; 10*2d9bdd9dSMatt Kulukundis Helper()11*2d9bdd9dSMatt Kulukundisint Helper() { 12*2d9bdd9dSMatt Kulukundis try { 13*2d9bdd9dSMatt Kulukundis static int i = []() { 14*2d9bdd9dSMatt Kulukundis throw P{}; 15*2d9bdd9dSMatt Kulukundis return 1; 16*2d9bdd9dSMatt Kulukundis }(); 17*2d9bdd9dSMatt Kulukundis return i; 18*2d9bdd9dSMatt Kulukundis } catch (P) { 19*2d9bdd9dSMatt Kulukundis return 0; 20*2d9bdd9dSMatt Kulukundis } 21*2d9bdd9dSMatt Kulukundis } 22*2d9bdd9dSMatt Kulukundis Thread(void * x)23*2d9bdd9dSMatt Kulukundisvoid *Thread(void *x) { 24*2d9bdd9dSMatt Kulukundis for (int i = 0; i < 1000; ++i) { 25*2d9bdd9dSMatt Kulukundis Helper(); 26*2d9bdd9dSMatt Kulukundis } 27*2d9bdd9dSMatt Kulukundis return 0; 28*2d9bdd9dSMatt Kulukundis } 29*2d9bdd9dSMatt Kulukundis main()30*2d9bdd9dSMatt Kulukundisint main() { 31*2d9bdd9dSMatt Kulukundis pthread_t t[2]; 32*2d9bdd9dSMatt Kulukundis pthread_create(&t[0], 0, Thread, 0); 33*2d9bdd9dSMatt Kulukundis pthread_create(&t[1], 0, Thread, 0); 34*2d9bdd9dSMatt Kulukundis pthread_join(t[0], 0); 35*2d9bdd9dSMatt Kulukundis pthread_join(t[1], 0); 36*2d9bdd9dSMatt Kulukundis fprintf(stderr, "PASS\n"); 37*2d9bdd9dSMatt Kulukundis } 38*2d9bdd9dSMatt Kulukundis 39*2d9bdd9dSMatt Kulukundis // CHECK-NOT: WARNING: ThreadSanitizer: data race 40