diff --git a/libcxx/include/__functional/reference_wrapper.h b/libcxx/include/__functional/reference_wrapper.h --- a/libcxx/include/__functional/reference_wrapper.h +++ b/libcxx/include/__functional/reference_wrapper.h @@ -34,25 +34,16 @@ private: type* __f_; -#ifndef _LIBCPP_CXX03_LANG static void __fun(_Tp&) _NOEXCEPT; static void __fun(_Tp&&) = delete; -#endif public: - // construct/copy/destroy -#ifdef _LIBCPP_CXX03_LANG - _LIBCPP_INLINE_VISIBILITY - reference_wrapper(type& __f) _NOEXCEPT - : __f_(_VSTD::addressof(__f)) {} -#else - template ::value, decltype(__fun(declval<_Up>())) >> + template ::value, decltype(__fun(declval<_Up>())) > > _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 reference_wrapper(_Up&& __u) _NOEXCEPT_(noexcept(__fun(declval<_Up>()))) { type& __f = static_cast<_Up&&>(__u); __f_ = _VSTD::addressof(__f); } -#endif // access _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 @@ -210,15 +201,11 @@ reference_wrapper cref(reference_wrapper<_Tp> __t) _NOEXCEPT { - // C++20 says "return __t", but C++03 lacks the relevant - // converting constructor. This should be equivalent. - return __t.get(); + return __t; } -#ifndef _LIBCPP_CXX03_LANG template void ref(const _Tp&&) = delete; template void cref(const _Tp&&) = delete; -#endif _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/test/std/utilities/function.objects/refwrap/refwrap.helpers/ref_1.compile.fail.cpp b/libcxx/test/std/utilities/function.objects/refwrap/refwrap.helpers/ref_1.compile.fail.cpp --- a/libcxx/test/std/utilities/function.objects/refwrap/refwrap.helpers/ref_1.compile.fail.cpp +++ b/libcxx/test/std/utilities/function.objects/refwrap/refwrap.helpers/ref_1.compile.fail.cpp @@ -14,8 +14,6 @@ // Don't allow binding to a temp -// XFAIL: c++03 - #include struct A {}; diff --git a/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_conv_ctor.pass.cpp b/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_conv_ctor.pass.cpp --- a/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_conv_ctor.pass.cpp +++ b/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_conv_ctor.pass.cpp @@ -6,8 +6,6 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03 - // // // reference_wrapper @@ -21,65 +19,58 @@ #include "test_macros.h" struct convertible_to_int_ref { - int val = 0; - operator int&() { return val; } - operator int const&() const { return val; } + int val = 0; + operator int&() { return val; } + operator int const&() const { return val; } }; template struct nothrow_convertible { - int val = 0; - operator int&() noexcept(IsNothrow) { return val; } + int val = 0; + operator int&() TEST_NOEXCEPT_COND(IsNothrow) { return val; } }; struct convertible_from_int { - convertible_from_int(int) {} + convertible_from_int(int) {} }; void meow(std::reference_wrapper) {} void meow(convertible_from_int) {} -int gi; -std::reference_wrapper purr() { return gi; }; - -template -void -test(T& t) -{ - std::reference_wrapper r(t); - assert(&r.get() == &t); -} - -void f() {} - int main(int, char**) { - convertible_to_int_ref convi; - test(convi); - convertible_to_int_ref const convic; - test(convic); - - { + { + convertible_to_int_ref t; + std::reference_wrapper r(t); + assert(&r.get() == &t); + } + { + const convertible_to_int_ref t; + std::reference_wrapper r(t); + assert(&r.get() == &t); + } + { using Ref = std::reference_wrapper; - static_assert((std::is_nothrow_constructible>::value), ""); - static_assert((!std::is_nothrow_constructible>::value), ""); - } - - { + ASSERT_NOEXCEPT(Ref(nothrow_convertible())); + ASSERT_NOT_NOEXCEPT(Ref(nothrow_convertible())); + } + { meow(0); - (true) ? purr() : 0; - } - -#if TEST_STD_VER >= 17 - { + } + { + extern std::reference_wrapper purr(); + ASSERT_SAME_TYPE(decltype(true ? purr() : 0), int); + } +#if TEST_STD_VER > 14 + { int i = 0; std::reference_wrapper ri(i); static_assert((std::is_same>::value), "" ); const int j = 0; std::reference_wrapper rj(j); static_assert((std::is_same>::value), "" ); - } + } #endif - return 0; + return 0; } diff --git a/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_conv_ctor2.pass.cpp b/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_conv_ctor2.pass.cpp --- a/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_conv_ctor2.pass.cpp +++ b/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_conv_ctor2.pass.cpp @@ -6,8 +6,6 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03 - // // // reference_wrapper @@ -20,46 +18,48 @@ #include "test_macros.h" -struct B {} b; +struct B {}; struct A1 { - operator B& () const { return b; } + mutable B b_; + TEST_CONSTEXPR operator B&() const { return b_; } }; + struct A2 { - operator B& () const noexcept { return b; } + mutable B b_; + TEST_CONSTEXPR operator B&() const TEST_NOEXCEPT { return b_; } }; -int main(int, char**) -{ - { - std::reference_wrapper b1 = A1(); - assert(&b1.get() == &b); - b1 = A1(); - assert(&b1.get() == &b); +void implicitly_convert(std::reference_wrapper) TEST_NOEXCEPT; - static_assert(std::is_convertible>::value, ""); - static_assert(!std::is_nothrow_constructible, A1>::value, ""); -#if TEST_STD_VER >= 20 - static_assert(!std::is_nothrow_convertible_v>); -#endif - static_assert(std::is_assignable, A1>::value, ""); - static_assert(!std::is_nothrow_assignable, A1>::value, ""); - } - - { - std::reference_wrapper b2 = A2(); - assert(&b2.get() == &b); - b2 = A2(); - assert(&b2.get() == &b); +TEST_CONSTEXPR_CXX20 bool test() +{ + { + A1 a; + ASSERT_NOT_NOEXCEPT(implicitly_convert(a)); + std::reference_wrapper b1 = a; + assert(&b1.get() == &a.b_); + ASSERT_NOT_NOEXCEPT(b1 = a); + b1 = a; + assert(&b1.get() == &a.b_); + } + { + A2 a; + ASSERT_NOEXCEPT(implicitly_convert(a)); + std::reference_wrapper b2 = a; + assert(&b2.get() == &a.b_); + ASSERT_NOEXCEPT(b2 = a); + b2 = a; + assert(&b2.get() == &a.b_); + } + return true; +} - static_assert(std::is_convertible>::value, ""); - static_assert(std::is_nothrow_constructible, A2>::value, ""); -#if TEST_STD_VER >= 20 - static_assert(std::is_nothrow_convertible_v>); +int main(int, char**) { + test(); +#if TEST_STD_VER > 17 + static_assert(test()); #endif - static_assert(std::is_assignable, A2>::value, ""); - static_assert(std::is_nothrow_assignable, A2>::value, ""); - } - return 0; + return 0; } diff --git a/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_ctor.compile.fail.cpp b/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_ctor.compile.fail.cpp --- a/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_ctor.compile.fail.cpp +++ b/libcxx/test/std/utilities/function.objects/refwrap/refwrap.const/type_ctor.compile.fail.cpp @@ -12,8 +12,6 @@ // reference_wrapper(T&&) = delete; -// XFAIL: c++03 - #include #include