// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s #include "test.h" pthread_mutex_t mtx; __attribute__((noinline)) void Func1() { pthread_mutex_lock(&mtx); __tsan_check_no_mutexes_held(); pthread_mutex_unlock(&mtx); } __attribute__((noinline)) void Func2() { pthread_mutex_lock(&mtx); pthread_mutex_unlock(&mtx); __tsan_check_no_mutexes_held(); } int main() { pthread_mutex_init(&mtx, NULL); Func1(); Func2(); return 0; } // CHECK: WARNING: ThreadSanitizer: mutex held in the wrong context // CHECK: {{.*}}__tsan_check_no_mutexes_held{{.*}} // CHECK: {{.*}}Func1{{.*}} // CHECK: {{.*}}main{{.*}} // CHECK: Mutex {{.*}} created at: // CHECK: {{.*}}pthread_mutex_init{{.*}} // CHECK: {{.*}}main{{.*}} // CHECK: SUMMARY: ThreadSanitizer: mutex held in the wrong context {{.*}}mutex_held_wrong_context.cpp{{.*}}Func1 // CHECK-NOT: SUMMARY: ThreadSanitizer: mutex held in the wrong context {{.*}}mutex_held_wrong_context.cpp{{.*}}Func2