https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121928
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- Slightly simpler version of the "fix it by defining OLD_CODE" change, with a little more context: --- a/libstdc++-v3/include/ext/atomicity.h +++ b/libstdc++-v3/include/ext/atomicity.h @@ -92,24 +92,29 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline _Atomic_word __attribute__((__always_inline__)) __exchange_and_add_single(_Atomic_word* __mem, int __val) { _Atomic_word __result = *__mem; +#ifdef OLD_CODE + *__mem += __val; +#else + _Atomic_word __result = *__mem; // Do the addition with an unsigned type so that overflow is well defined. #if __cplusplus >= 201103L std::make_unsigned<_Atomic_word>::type __u; #else // For most targets make_unsigned_t<_Atomic_word> is unsigned int, // but 64-bit sparc uses long for _Atomic_word. // Sign-extending to unsigned long works for both cases. unsigned long __u; #endif __u = __result; __u += __val; *__mem = __u; +#endif return __result; } inline void __attribute__((__always_inline__)) __atomic_add_single(_Atomic_word* __mem, int __val)