https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68260
Dmitry Vyukov <dvyukov at google dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |dvyukov at google dot com --- Comment #1 from Dmitry Vyukov <dvyukov at google dot com> --- gcc does not instrument atomic operations: 00000000004a73d0 <_ZN4spin6unlockEv>: void unlock() { flag.clear(std::memory_order_release); } 4a73d0: 55 push %rbp 4a73d1: 48 89 e5 mov %rsp,%rbp 4a73d4: 48 83 ec 10 sub $0x10,%rsp 4a73d8: 48 8b 45 08 mov 0x8(%rbp),%rax 4a73dc: 48 89 7d f0 mov %rdi,-0x10(%rbp) 4a73e0: 48 89 c7 mov %rax,%rdi 4a73e3: e8 68 4f fd ff callq 47c350 <__tsan_func_entry> 4a73e8: be 03 00 00 00 mov $0x3,%esi 4a73ed: 48 8b 45 f0 mov -0x10(%rbp),%rax 4a73f1: 48 89 45 f8 mov %rax,-0x8(%rbp) 4a73f5: 48 8b 7d f8 mov -0x8(%rbp),%rdi 4a73f9: e8 62 02 00 00 callq 4a7660 <_ZNSt11atomic_flag5clearESt12memory_order> 4a73fe: e8 fd 4f fd ff callq 47c400 <__tsan_func_exit> 4a7403: 48 83 c4 10 add $0x10,%rsp 4a7407: 5d pop %rbp 4a7408: c3 retq FWIW this programs works fine with clang.