diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b9cca6af0ff..67e5b893f24 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2012-01-27 Richard Henderson + + * include/bits/atomic_base.h (__atomic_flag_base): Define _M_i + based on the value of __GCC_ATOMIC_TEST_AND_SET_TRUEVAL. + (ATOMIC_FLAG_INIT): Initialize with 0, not false. + (atomic_flag::atomic_flag): Use __GCC_ATOMIC_TEST_AND_SET_TRUEVAL. + 2012-01-26 Jakub Jelinek PR bootstrap/51985 diff --git a/libstdc++-v3/include/bits/atomic_base.h b/libstdc++-v3/include/bits/atomic_base.h index ef17b7e12e6..aa43bccd1bf 100644 --- a/libstdc++-v3/include/bits/atomic_base.h +++ b/libstdc++-v3/include/bits/atomic_base.h @@ -227,12 +227,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct __atomic_flag_base { + /* The target's "set" value for test-and-set may not be exactly 1. */ +#if __GCC_ATOMIC_TEST_AND_SET_TRUEVAL == 1 bool _M_i; +#else + unsigned char _M_i; +#endif }; _GLIBCXX_END_EXTERN_C -#define ATOMIC_FLAG_INIT { false } +#define ATOMIC_FLAG_INIT { 0 } /// atomic_flag struct atomic_flag : public __atomic_flag_base @@ -244,7 +249,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION atomic_flag& operator=(const atomic_flag&) volatile = delete; // Conversion to ATOMIC_FLAG_INIT. - atomic_flag(bool __i) noexcept : __atomic_flag_base({ __i }) { } + constexpr atomic_flag(bool __i) noexcept + : __atomic_flag_base({ __i ? __GCC_ATOMIC_TEST_AND_SET_TRUEVAL : 0 }) + { } bool test_and_set(memory_order __m = memory_order_seq_cst) noexcept