Переглянути джерело

Fix PR26961 - Add default constructor to std::pointer_safety struct.

In ABI v1 libc++ implements std::pointer_safety as a class type instead
of an enumeration. However this class type does not provide
a default constructor as it should. This patch adds that default constructor.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@291059 91177308-0d34-0410-b5e6-96231b3b80d8
Eric Fiselier 8 роки тому
батько
коміт
c3dfeced41

+ 3 - 0
include/memory

@@ -5636,6 +5636,9 @@ struct _LIBCPP_TYPE_VIS pointer_safety
 
     __lx __v_;
 
+    _LIBCPP_INLINE_VISIBILITY
+    pointer_safety() : __v_() {}
+
     _LIBCPP_INLINE_VISIBILITY
     pointer_safety(__lx __v) : __v_(__v) {}
     _LIBCPP_INLINE_VISIBILITY

+ 22 - 2
test/libcxx/utilities/memory/util.dynamic.safety/get_pointer_safety_cxx03.pass.cpp

@@ -14,13 +14,33 @@
 #include <memory>
 #include <cassert>
 
+#include "test_macros.h"
+
+// libc++ doesn't offer std::pointer_safety in C++03 under the new ABI
+#if TEST_STD_VER < 11 && defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE)
+#define TEST_IS_UNSUPPORTED
+#endif
+
+#ifndef TEST_IS_UNSUPPORTED
+void test_pr26961() {
+  std::pointer_safety d;
+  d = std::get_pointer_safety();
+  assert(d == std::get_pointer_safety());
+}
+#endif
+
 int main()
 {
-  // Test that std::pointer_safety is still offered in C++03 under the old ABI.
-#ifndef _LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE
+#ifndef TEST_IS_UNSUPPORTED
+  {
+    // Test that std::pointer_safety is still offered in C++03 under the old ABI.
     std::pointer_safety r = std::get_pointer_safety();
     assert(r == std::pointer_safety::relaxed ||
            r == std::pointer_safety::preferred ||
            r == std::pointer_safety::strict);
+  }
+  {
+    test_pr26961();
+  }
 #endif
 }

+ 12 - 0
test/std/utilities/memory/util.dynamic.safety/get_pointer_safety.pass.cpp

@@ -16,10 +16,22 @@
 #include <memory>
 #include <cassert>
 
+
+void test_pr26961() {
+  std::pointer_safety d;
+  d = std::get_pointer_safety();
+  assert(d == std::get_pointer_safety());
+}
+
 int main()
 {
+  {
     std::pointer_safety r = std::get_pointer_safety();
     assert(r == std::pointer_safety::relaxed ||
            r == std::pointer_safety::preferred ||
            r == std::pointer_safety::strict);
+  }
+  {
+    test_pr26961();
+  }
 }