13168586f24f2d275e6fae167d9a4d98238004f43Alexey Samsonov// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
2da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <pthread.h>
3da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <stdio.h>
4da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <unistd.h>
5da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
6da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyint Global;
7da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
8da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid __attribute__((noinline)) foo1() {
9da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  Global = 42;
10da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
11da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
12da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid __attribute__((noinline)) bar1() {
135092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  volatile int tmp = 42;
145092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  int tmp2 = tmp;
155092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  (void)tmp2;
16da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  foo1();
17da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
18da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
19da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid __attribute__((noinline)) foo2() {
205092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  volatile int tmp = Global;
215092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  int tmp2 = tmp;
225092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  (void)tmp2;
23da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
24da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
25da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid __attribute__((noinline)) bar2() {
265092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  volatile int tmp = 42;
275092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  int tmp2 = tmp;
285092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  (void)tmp2;
29da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  foo2();
30da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
31da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
32da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid *Thread1(void *x) {
3363a22f073dcdfbabc492ca4c9eb06d0571915570Dmitry Vyukov  sleep(1);
34da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  bar1();
35da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  return NULL;
36da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
37da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
38da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyint main() {
39da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  pthread_t t;
40da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  pthread_create(&t, NULL, Thread1, NULL);
41da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  bar2();
42da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  pthread_join(t, NULL);
43da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
44da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
45da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// CHECK:      WARNING: ThreadSanitizer: data race
46ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// CHECK-NEXT:   Write of size 4 at {{.*}} by thread T1:
473168586f24f2d275e6fae167d9a4d98238004f43Alexey Samsonov// CHECK-NEXT:     #0 foo1{{.*}} {{.*}}simple_stack2.cc:9{{(:3)?}} ({{.*}})
483168586f24f2d275e6fae167d9a4d98238004f43Alexey Samsonov// CHECK-NEXT:     #1 bar1{{.*}} {{.*}}simple_stack2.cc:16{{(:3)?}} ({{.*}})
493168586f24f2d275e6fae167d9a4d98238004f43Alexey Samsonov// CHECK-NEXT:     #2 Thread1{{.*}} {{.*}}simple_stack2.cc:34{{(:3)?}} ({{.*}})
50ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov// CHECK:        Previous read of size 4 at {{.*}} by main thread:
513168586f24f2d275e6fae167d9a4d98238004f43Alexey Samsonov// CHECK-NEXT:     #0 foo2{{.*}} {{.*}}simple_stack2.cc:20{{(:28)?}} ({{.*}})
523168586f24f2d275e6fae167d9a4d98238004f43Alexey Samsonov// CHECK-NEXT:     #1 bar2{{.*}} {{.*}}simple_stack2.cc:29{{(:3)?}} ({{.*}})
533168586f24f2d275e6fae167d9a4d98238004f43Alexey Samsonov// CHECK-NEXT:     #2 main{{.*}} {{.*}}simple_stack2.cc:41{{(:3)?}} ({{.*}})
54