xref: /llvm-project/compiler-rt/test/tsan/static_init7.cpp (revision 2d9bdd9dba05f01941f97a2ccc911212139142d0)
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 Kulukundis int 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 Kulukundis void *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 Kulukundis int 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