1 // RUN: %clangxx_tsan -O1 --std=c++11 %s -o %t && %run %t 2>&1 | FileCheck %s
2 #include "custom_mutex.h"
6 // Test that the destruction events of a mutex are ignored when the
7 // annotations request this.
9 // Use after destruction is UB, but __tsan_mutex_linker_init and
10 // __tsan_mutex_not_static exist to support global variables of mutex type,
11 // which might be accessed during program shutdown after the class's destructor
15 std::aligned_storage
<sizeof(Mutex
), alignof(Mutex
)>::type mu1_store
;
16 Mutex
* mu1
= reinterpret_cast<Mutex
*>(&mu1_store
);
17 new(&mu1_store
) Mutex(false, __tsan_mutex_linker_init
);
22 std::aligned_storage
<sizeof(Mutex
), alignof(Mutex
)>::type mu2_store
;
23 Mutex
* mu2
= reinterpret_cast<Mutex
*>(&mu2_store
);
24 new(&mu2_store
) Mutex(false, 0, __tsan_mutex_not_static
);
29 fprintf(stderr
, "DONE\n");