| // RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s |
| #include "test.h" |
| |
| void *thread(void *x) { |
| barrier_wait(&barrier); |
| *static_cast<int *>(x) = 2; |
| return nullptr; |
| } |
| |
| static void race() { |
| int data = 0; |
| pthread_t t; |
| pthread_create(&t, nullptr, thread, &data); |
| data = 1; |
| barrier_wait(&barrier); |
| pthread_join(t, nullptr); |
| } |
| |
| struct X { |
| __attribute__((noinline)) |
| X() { atexit(race); } |
| } x; |
| |
| int main() { |
| barrier_init(&barrier, 2); |
| fprintf(stderr, "DONE\n"); |
| } |
| |
| // CHECK: DONE |
| // CHECK: WARNING: ThreadSanitizer: data race |
| // CHECK: Write of size 4 |
| // CHECK: #0 thread |
| // CHECK: Previous write of size 4 |
| // CHECK: #0 race |
| // CHECK: #1 at_exit_callback_installed_at |
| // CHECK: #2 X |