PR libstdc++/65033
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Mar 2015 18:31:11 +0000 (18:31 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Mar 2015 18:31:11 +0000 (18:31 +0000)
 * include/bits/atomic_base.h (__atomic_base<T>::is_lock_free): Build
 a fake pointer indicating type alignment.
 (__atomic_base<T *>::is_lock_free): Likewise.
 * include/std/atomic (atomic<T>::is_lock_free): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221701 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/atomic_base.h
libstdc++-v3/include/std/atomic

index 6793e9d..cd4640a 100644 (file)
@@ -1,3 +1,11 @@
+2015-03-26  Richard Henderson  <rth@redhat.com>
+
+       PR libstdc++/65033
+       * include/bits/atomic_base.h (__atomic_base<T>::is_lock_free): Build
+       a fake pointer indicating type alignment.
+       (__atomic_base<T *>::is_lock_free): Likewise.
+       * include/std/atomic (atomic<T>::is_lock_free): Likewise.
+
 2015-03-25  Alan Lawrence  <alan.lawrence@arm.com>
 
        PR libstdc++/33394
index fe6524f..8104c98 100644 (file)
@@ -346,11 +346,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       bool
       is_lock_free() const noexcept
-      { return __atomic_is_lock_free(sizeof(_M_i), nullptr); }
+      {
+       // Produce a fake, minimally aligned pointer.
+       void *__a = reinterpret_cast<void *>(-__alignof(_M_i));
+       return __atomic_is_lock_free(sizeof(_M_i), __a);
+      }
 
       bool
       is_lock_free() const volatile noexcept
-      { return __atomic_is_lock_free(sizeof(_M_i), nullptr); }
+      {
+       // Produce a fake, minimally aligned pointer.
+       void *__a = reinterpret_cast<void *>(-__alignof(_M_i));
+       return __atomic_is_lock_free(sizeof(_M_i), __a);
+      }
 
       _GLIBCXX_ALWAYS_INLINE void
       store(__int_type __i, memory_order __m = memory_order_seq_cst) noexcept
@@ -653,11 +661,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       bool
       is_lock_free() const noexcept
-      { return __atomic_is_lock_free(sizeof(__pointer_type), nullptr); }
+      {
+       // Produce a fake, minimally aligned pointer.
+       void *__a = reinterpret_cast<void *>(-__alignof(_M_p));
+       return __atomic_is_lock_free(sizeof(_M_p), __a);
+      }
 
       bool
       is_lock_free() const volatile noexcept
-      { return __atomic_is_lock_free(sizeof(__pointer_type), nullptr); }
+      {
+       // Produce a fake, minimally aligned pointer.
+       void *__a = reinterpret_cast<void *>(-__alignof(_M_p));
+       return __atomic_is_lock_free(sizeof(_M_p), __a);
+      }
 
       _GLIBCXX_ALWAYS_INLINE void
       store(__pointer_type __p,
index 1a17427..cc4b5f1 100644 (file)
@@ -198,11 +198,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       bool
       is_lock_free() const noexcept
-      { return __atomic_is_lock_free(sizeof(_M_i), nullptr); }
+      {
+       // Produce a fake, minimally aligned pointer.
+       void *__a = reinterpret_cast<void *>(-__alignof(_M_i));
+       return __atomic_is_lock_free(sizeof(_M_i), __a);
+      }
 
       bool
       is_lock_free() const volatile noexcept
-      { return __atomic_is_lock_free(sizeof(_M_i), nullptr); }
+      {
+       // Produce a fake, minimally aligned pointer.
+       void *__a = reinterpret_cast<void *>(-__alignof(_M_i));
+       return __atomic_is_lock_free(sizeof(_M_i), __a);
+      }
 
       void
       store(_Tp __i, memory_order __m = memory_order_seq_cst) noexcept