diff --git a/include/variant b/include/variant index baf163050..5d0722b62 100644 --- a/include/variant +++ b/include/variant @@ -1098,39 +1098,11 @@ struct __overload<> { void operator()() const; }; template struct __overload<_Tp, _Types...> : __overload<_Types...> { using __overload<_Types...>::operator(); - - static auto __test(_Tp (&&)[1]) -> __identity<_Tp>; - - template - auto operator()(_Tp, _Up&& __t) const - -> decltype(__test({ _VSTD::forward<_Up>(__t) })); + __identity<_Tp> operator()(_Tp) const; }; -template -struct __overload_bool : _Base { - using _Base::operator(); - - template > - auto operator()(bool, _Up&&) const - -> enable_if_t, __identity<_Tp>>; -}; - -template -struct __overload - : __overload_bool<__overload<_Types...>, bool> {}; -template -struct __overload - : __overload_bool<__overload<_Types...>, bool const> {}; -template -struct __overload - : __overload_bool<__overload<_Types...>, bool volatile> {}; -template -struct __overload - : __overload_bool<__overload<_Types...>, bool const volatile> {}; - template -using __best_match_t = - typename invoke_result_t<__overload<_Types...>, _Tp, _Tp>::type; +using __best_match_t = typename result_of_t<__overload<_Types...>(_Tp&&)>::type; } // __variant_detail diff --git a/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp b/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp index b2b53d6c6..02498b1ac 100644 --- a/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp +++ b/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include "test_macros.h" #include "variant_test_helpers.hpp" @@ -123,7 +122,7 @@ void test_T_assignment_noexcept() { void test_T_assignment_sfinae() { { - using V = std::variant; + using V = std::variant; static_assert(!std::is_assignable::value, "ambiguous"); } { @@ -134,31 +133,6 @@ void test_T_assignment_sfinae() { using V = std::variant; static_assert(!std::is_assignable::value, "no matching operator="); } - { - using V = std::variant; - static_assert(!std::is_assignable::value, "no matching operator="); - } - { - using V = std::variant, bool>; - static_assert(!std::is_assignable>::value, - "no explicit bool in operator="); - struct X { - operator void*(); - }; - static_assert(!std::is_assignable::value, - "no boolean conversion in operator="); - static_assert(!std::is_assignable::value, - "no converted to bool in operator="); - } - { - struct X {}; - struct Y { - operator X(); - }; - using V = std::variant; - static_assert(std::is_assignable::value, - "regression on user-defined conversions in operator="); - } #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) { using V = std::variant; @@ -187,37 +161,6 @@ void test_T_assignment_basic() { assert(v.index() == 1); assert(std::get<1>(v) == 43); } - { - std::variant v; - v = 42; - assert(v.index() == 1); - assert(std::get<1>(v) == 42); - v = 43u; - assert(v.index() == 0); - assert(std::get<0>(v) == 43); - } - { - std::variant v = true; - v = "bar"; - assert(v.index() == 0); - assert(std::get<0>(v) == "bar"); - } - { - std::variant> v; - v = nullptr; - assert(v.index() == 1); - assert(std::get<1>(v) == nullptr); - } - { - std::variant v = 42; - v = false; - assert(v.index() == 0); - assert(!std::get<0>(v)); - bool lvt = true; - v = lvt; - assert(v.index() == 0); - assert(std::get<0>(v)); - } #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) { using V = std::variant; diff --git a/test/std/utilities/variant/variant.variant/variant.assign/conv.fail.cpp b/test/std/utilities/variant/variant.variant/variant.assign/conv.fail.cpp deleted file mode 100644 index d5f370d27..000000000 --- a/test/std/utilities/variant/variant.variant/variant.assign/conv.fail.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++98, c++03, c++11, c++14 - -// - -// template class variant; - -// template -// variant& operator=(T&&) noexcept(see below); - -#include -#include -#include - -int main(int, char**) -{ - std::variant v1; - std::variant v2; - std::variant v3; - v1 = 1; // expected-error {{no viable overloaded '='}} - v2 = 1; // expected-error {{no viable overloaded '='}} - v3 = 1; // expected-error {{no viable overloaded '='}} - - std::variant v4; - std::variant v5; - std::variant v6; - v4 = 1; // expected-error {{no viable overloaded '='}} - v5 = 1; // expected-error {{no viable overloaded '='}} - v6 = 1; // expected-error {{no viable overloaded '='}} - - std::variant v7; - std::variant v8; - std::variant v9; - v7 = "meow"; // expected-error {{no viable overloaded '='}} - v8 = "meow"; // expected-error {{no viable overloaded '='}} - v9 = "meow"; // expected-error {{no viable overloaded '='}} - - std::variant v10; - std::variant v11; - std::variant v12; - v10 = std::true_type(); // expected-error {{no viable overloaded '='}} - v11 = std::unique_ptr(); // expected-error {{no viable overloaded '='}} - v12 = nullptr; // expected-error {{no viable overloaded '='}} -} diff --git a/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp b/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp index 40fa20b4f..73bd2c628 100644 --- a/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp +++ b/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp @@ -20,8 +20,8 @@ #include #include #include -#include +#include "test_convertible.hpp" #include "test_macros.h" #include "variant_test_helpers.hpp" @@ -39,8 +39,6 @@ struct NoThrowT { struct AnyConstructible { template AnyConstructible(T&&) {} }; struct NoConstructible { NoConstructible() = delete; }; -template -struct RValueConvertibleFrom { RValueConvertibleFrom(T&&) {} }; void test_T_ctor_noexcept() { { @@ -55,7 +53,7 @@ void test_T_ctor_noexcept() { void test_T_ctor_sfinae() { { - using V = std::variant; + using V = std::variant; static_assert(!std::is_constructible::value, "ambiguous"); } { @@ -67,32 +65,6 @@ void test_T_ctor_sfinae() { static_assert(!std::is_constructible::value, "no matching constructor"); } - { - using V = std::variant; - static_assert(!std::is_constructible::value, - "no matching constructor"); - } - { - using V = std::variant, bool>; - static_assert(!std::is_constructible>::value, - "no explicit bool in constructor"); - struct X { - operator void*(); - }; - static_assert(!std::is_constructible::value, - "no boolean conversion in constructor"); - static_assert(!std::is_constructible::value, - "no converted to bool in constructor"); - } - { - struct X {}; - struct Y { - operator X(); - }; - using V = std::variant; - static_assert(std::is_constructible::value, - "regression on user-defined conversions in constructor"); - } { using V = std::variant; static_assert( @@ -127,34 +99,6 @@ void test_T_ctor_basic() { static_assert(v.index() == 1, ""); static_assert(std::get<1>(v) == 42, ""); } - { - constexpr std::variant v(42); - static_assert(v.index() == 1, ""); - static_assert(std::get<1>(v) == 42, ""); - } - { - std::variant v = "foo"; - assert(v.index() == 0); - assert(std::get<0>(v) == "foo"); - } - { - std::variant> v = nullptr; - assert(v.index() == 1); - assert(std::get<1>(v) == nullptr); - } - { - std::variant v = true; - assert(v.index() == 0); - assert(std::get<0>(v)); - } - { - std::variant> v1 = 42; - assert(v1.index() == 0); - - int x = 42; - std::variant, AnyConstructible> v2 = x; - assert(v2.index() == 1); - } #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) { using V = std::variant; diff --git a/test/std/utilities/variant/variant.variant/variant.ctor/conv.fail.cpp b/test/std/utilities/variant/variant.variant/variant.ctor/conv.fail.cpp deleted file mode 100644 index 76b42ac22..000000000 --- a/test/std/utilities/variant/variant.variant/variant.ctor/conv.fail.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++98, c++03, c++11, c++14 - -// - -// template class variant; - -// template constexpr variant(T&&) noexcept(see below); - -#include -#include -#include - -int main(int, char**) -{ - std::variant v1 = 1; // expected-error {{no viable conversion}} - std::variant v2 = 1; // expected-error {{no viable conversion}} - std::variant v3 = 1; // expected-error {{no viable conversion}} - - std::variant v4 = 1; // expected-error {{no viable conversion}} - std::variant v5 = 1; // expected-error {{no viable conversion}} - std::variant v6 = 1; // expected-error {{no viable conversion}} - - std::variant v7 = "meow"; // expected-error {{no viable conversion}} - std::variant v8 = "meow"; // expected-error {{no viable conversion}} - std::variant v9 = "meow"; // expected-error {{no viable conversion}} - - std::variant v10 = std::true_type(); // expected-error {{no viable conversion}} - std::variant v11 = std::unique_ptr(); // expected-error {{no viable conversion}} - std::variant v12 = nullptr; // expected-error {{no viable conversion}} -} diff --git a/www/cxx2a_status.html b/www/cxx2a_status.html index 37b8ff7b0..4ee699780 100644 --- a/www/cxx2a_status.html +++ b/www/cxx2a_status.html @@ -115,7 +115,7 @@ P0591R4LWGUtility functions to implement uses-allocator constructionSan Diego P0595R2CWGP0595R2 std::is_constant_evaluated()San DiegoComplete9.0 P0602R4LWGvariant and optional should propagate copy/move trivialitySan DiegoComplete8.0 - P0608R3LWGA sane variant converting constructorSan DiegoComplete9.0 + P0608R3LWGA sane variant converting constructorSan Diego P0655R1LWGvisit<R>: Explicit Return Type for visitSan Diego P0771R1LWGstd::function move constructor should be noexceptSan DiegoComplete6.0 P0896R4LWGThe One Ranges ProposalSan Diego