From: Ville Voutilainen Date: Thu, 29 Dec 2016 19:19:59 +0000 (+0200) Subject: Implement LWG 2842, in_place_t check for optional::optional(U&&) should decay U. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2ae2d394c1f9928fcb4bb7efdf9874edb787936a;p=gcc.git Implement LWG 2842, in_place_t check for optional::optional(U&&) should decay U. Implement LWG 2842, in_place_t check for optional::optional(U&&) should decay U. * include/std/optional (_Optional_base(in_place_t, _Args&&...)): Constrain. (_Optional_base(in_place_t, initializer_list<_Up>, _Args&&...)): Turn the int-pack constraint hack into a saner bool. (_Optional_base<_Tp, false>::_Optional_base(in_place_t, _Args&&...)): Constrain. (_Optional_base<_Tp, false>::_Optional_base(in_place_t, initializer_list<_Up>, _Args&&...)): Turn the int-pack constraint hack into a saner bool. (optional(_Up&&)): Constrain against in_place_t. (optional(in_place_t, _Args&&...)): Constrain. (constexpr optional(in_place_t, initializer_list<_Up>, _Args&&...)): Turn the int-pack constraint hack into a saner bool. * testsuite/20_util/optional/cons/value_neg.cc: Add a test for a type that is constructible from in_place. From-SVN: r243966 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 32b81e8bbb7..34ca95a846e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,23 @@ +2016-12-29 Ville Voutilainen + + Implement LWG 2842, in_place_t check for optional::optional(U&&) + should decay U. + * include/std/optional (_Optional_base(in_place_t, _Args&&...)): + Constrain. + (_Optional_base(in_place_t, initializer_list<_Up>, _Args&&...)): + Turn the int-pack constraint hack into a saner bool. + (_Optional_base<_Tp, false>::_Optional_base(in_place_t, _Args&&...)): + Constrain. + (_Optional_base<_Tp, false>::_Optional_base(in_place_t, + initializer_list<_Up>, _Args&&...)): + Turn the int-pack constraint hack into a saner bool. + (optional(_Up&&)): Constrain against in_place_t. + (optional(in_place_t, _Args&&...)): Constrain. + (constexpr optional(in_place_t, initializer_list<_Up>, _Args&&...)): + Turn the int-pack constraint hack into a saner bool. + * testsuite/20_util/optional/cons/value_neg.cc: Add a test for + a type that is constructible from in_place. + 2016-12-24 François Dumont * include/ext/random.tcc: Fix usage of _OutputIteratorConcept. diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional index 3d69e104199..73bc2b42bf3 100644 --- a/libstdc++-v3/include/std/optional +++ b/libstdc++-v3/include/std/optional @@ -128,15 +128,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : _Optional_base{} { } // Constructors for engaged optionals. - template + template, bool> = false> constexpr explicit _Optional_base(in_place_t, _Args&&... __args) : _M_payload(std::forward<_Args>(__args)...), _M_engaged(true) { } template&, - _Args&&...>::value, - int>...> + enable_if_t&, + _Args&&...>, bool> = false> constexpr explicit _Optional_base(in_place_t, initializer_list<_Up> __il, _Args&&... __args) @@ -264,15 +264,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr _Optional_base(nullopt_t) noexcept : _Optional_base{} { } - template + template, bool> = false> constexpr explicit _Optional_base(in_place_t, _Args&&... __args) : _M_payload(std::forward<_Args>(__args)...), _M_engaged(true) { } template&, - _Args&&...>::value, - int>...> + enable_if_t&, + _Args&&...>, bool> = false> constexpr explicit _Optional_base(in_place_t, initializer_list<_Up> __il, _Args&&... __args) @@ -432,6 +432,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template , decay_t<_Up>>>, + __not_>>, is_constructible<_Tp, _Up&&>, is_convertible<_Up&&, _Tp> >::value, bool> = true> @@ -441,6 +442,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template , decay_t<_Up>>>, + __not_>>, is_constructible<_Tp, _Up&&>, __not_> >::value, bool> = false> @@ -499,15 +501,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION emplace(std::move(*__t)); } - template + template, bool> = false> explicit constexpr optional(in_place_t, _Args&&... __args) : _Base(std::in_place, std::forward<_Args>(__args)...) { } template&, - _Args&&...>::value, - int>...> + enable_if_t&, + _Args&&...>, bool> = false> explicit constexpr optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args) diff --git a/libstdc++-v3/testsuite/20_util/optional/cons/value_neg.cc b/libstdc++-v3/testsuite/20_util/optional/cons/value_neg.cc index 21e86c5a5b4..6a2827ec461 100644 --- a/libstdc++-v3/testsuite/20_util/optional/cons/value_neg.cc +++ b/libstdc++-v3/testsuite/20_util/optional/cons/value_neg.cc @@ -35,5 +35,10 @@ int main() std::optional ox2 = 42; // { dg-error "conversion" } std::optional> oup{new int}; std::optional> oup2 = new int; // { dg-error "conversion" } + struct U { explicit U(std::in_place_t); }; + std::optional ou(std::in_place); // { dg-error "no matching" } + // { dg-error "no type" "" { target { *-*-* } } 438 } + // { dg-error "no type" "" { target { *-*-* } } 448 } + // { dg-error "no type" "" { target { *-*-* } } 505 } } }