diff --git a/compiler-rt/test/tsan/on_exit.cpp b/compiler-rt/test/tsan/on_exit.cpp new file mode 100644 --- /dev/null +++ b/compiler-rt/test/tsan/on_exit.cpp @@ -0,0 +1,31 @@ +// RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s +#include "test.h" + +volatile long global; + +void *thread(void *x) { + global++; + barrier_wait(&barrier); + return nullptr; +} + +void on_exit_callback(int status, void *arg) { + fprintf(stderr, "on_exit_callback(%d, %lu)\n", status, (long)arg); + global++; +} + +int main() { + on_exit(on_exit_callback, (void *)42l); + barrier_init(&barrier, 2); + pthread_t th; + pthread_create(&th, nullptr, thread, nullptr); + pthread_detach(th); + barrier_wait(&barrier); + return 2; +} + +// CHECK: on_exit_callback(2, 42) +// CHECK: WARNING: ThreadSanitizer: data race +// CHECK: Write of size 8 +// CHECK: #0 on_exit_callback +// CHECK: #1 on_exit_wrapper