]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/60658 (std::atomic<T*> is unexpectedly not lock-free)
authorJonathan Wakely <jwakely@redhat.com>
Tue, 25 Mar 2014 20:40:17 +0000 (20:40 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 25 Mar 2014 20:40:17 +0000 (20:40 +0000)
PR libstdc++/60658
* include/bits/atomic_base.h (__atomic_base<_PTp*>::is_lock_free()):
Use sizeof pointer type not the element type.
* testsuite/29_atomics/atomic/60658.cc: New.

From-SVN: r208821

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/atomic_base.h
libstdc++-v3/testsuite/29_atomics/atomic/60658.cc [new file with mode: 0644]

index ecb98513702dede1acb49512a5474406d2033aaf..4378c9b1928ea6c88ccd4eab265fdd608c1eb1ed 100644 (file)
@@ -1,3 +1,10 @@
+2014-03-25  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/60658
+       * include/bits/atomic_base.h (__atomic_base<_PTp*>::is_lock_free()):
+       Use sizeof pointer type not the element type.
+       * testsuite/29_atomics/atomic/60658.cc: New.
+
 2013-11-05 Jonathan Wakely  <jwakely.gcc@gmail.com>
 
        * doc/xml/manual/status_cxx2011.xml: Document aligned_union as
index 191db7b5f01cce2bc0e6d1c893161e20268f9fe1..8995b1b40216e6081c9f9a5bce4ba25b01b143ca 100644 (file)
@@ -722,11 +722,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       bool
       is_lock_free() const noexcept
-      { return __atomic_is_lock_free(_M_type_size(1), &_M_p); }
+      { return __atomic_is_lock_free(sizeof(__pointer_type), &_M_p); }
 
       bool
       is_lock_free() const volatile noexcept
-      { return __atomic_is_lock_free(_M_type_size(1), &_M_p); }
+      { return __atomic_is_lock_free(sizeof(__pointer_type), &_M_p); }
 
       void
       store(__pointer_type __p,
diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/60658.cc b/libstdc++-v3/testsuite/29_atomics/atomic/60658.cc
new file mode 100644 (file)
index 0000000..5634085
--- /dev/null
@@ -0,0 +1,43 @@
+// { dg-require-atomic-builtins "" }
+// { dg-options "-std=gnu++11" }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <atomic>
+#include <testsuite_hooks.h>
+
+// libstdc++/60658
+
+struct Foo {
+  char buf[1];
+};
+
+struct Bar {
+  char buf[100];
+};
+
+int
+main ()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::atomic<Foo*> a;
+  std::atomic<Bar*> b;
+
+  VERIFY (a.is_lock_free() == b.is_lock_free());
+}