diff options
| author | Eric Fiselier <eric@efcs.ca> | 2017-01-05 01:28:40 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2017-01-05 01:28:40 +0000 |
| commit | 76a01ea34d6574a4333d98eeb3b8bc7f9472f579 (patch) | |
| tree | 001de61ee082cbbd7a4b794c3425b78ad84deae0 | |
| parent | be04bfee2a35bea91d0e64eb0dfc1c454ffc37e9 (diff) | |
| download | bcm5719-llvm-76a01ea34d6574a4333d98eeb3b8bc7f9472f579.tar.gz bcm5719-llvm-76a01ea34d6574a4333d98eeb3b8bc7f9472f579.zip | |
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.
llvm-svn: 291059
3 files changed, 37 insertions, 2 deletions
diff --git a/libcxx/include/memory b/libcxx/include/memory index 3ea9a77d0d4..a38d95b9446 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -5637,6 +5637,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 operator int() const {return __v_;} diff --git a/libcxx/test/libcxx/utilities/memory/util.dynamic.safety/get_pointer_safety_cxx03.pass.cpp b/libcxx/test/libcxx/utilities/memory/util.dynamic.safety/get_pointer_safety_cxx03.pass.cpp index 04671c3a967..6d49cea8ba1 100644 --- a/libcxx/test/libcxx/utilities/memory/util.dynamic.safety/get_pointer_safety_cxx03.pass.cpp +++ b/libcxx/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 } diff --git a/libcxx/test/std/utilities/memory/util.dynamic.safety/get_pointer_safety.pass.cpp b/libcxx/test/std/utilities/memory/util.dynamic.safety/get_pointer_safety.pass.cpp index ee2f81713b2..df77be9643d 100644 --- a/libcxx/test/std/utilities/memory/util.dynamic.safety/get_pointer_safety.pass.cpp +++ b/libcxx/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(); + } } |

