Author: ericwf Date: Wed Jan 4 19:28:40 2017 New Revision: 291059 URL: http://llvm.org/viewvc/llvm-project?rev=291059&view=rev Log: 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. Modified: libcxx/trunk/include/memory libcxx/trunk/test/libcxx/utilities/memory/util.dynamic.safety/get_pointer_safety_cxx03.pass.cpp libcxx/trunk/test/std/utilities/memory/util.dynamic.safety/get_pointer_safety.pass.cpp Modified: libcxx/trunk/include/memory URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/memory?rev=291059&r1=291058&r2=291059&view=diff ============================================================================== --- libcxx/trunk/include/memory (original) +++ libcxx/trunk/include/memory Wed Jan 4 19:28:40 2017 @@ -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_;} Modified: libcxx/trunk/test/libcxx/utilities/memory/util.dynamic.safety/get_pointer_safety_cxx03.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/utilities/memory/util.dynamic.safety/get_pointer_safety_cxx03.pass.cpp?rev=291059&r1=291058&r2=291059&view=diff ============================================================================== --- libcxx/trunk/test/libcxx/utilities/memory/util.dynamic.safety/get_pointer_safety_cxx03.pass.cpp (original) +++ libcxx/trunk/test/libcxx/utilities/memory/util.dynamic.safety/get_pointer_safety_cxx03.pass.cpp Wed Jan 4 19:28:40 2017 @@ -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 } Modified: libcxx/trunk/test/std/utilities/memory/util.dynamic.safety/get_pointer_safety.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/util.dynamic.safety/get_pointer_safety.pass.cpp?rev=291059&r1=291058&r2=291059&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/memory/util.dynamic.safety/get_pointer_safety.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/memory/util.dynamic.safety/get_pointer_safety.pass.cpp Wed Jan 4 19:28:40 2017 @@ -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(); + } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits