Message ID | 20220318154303.532138-1-jwakely@redhat.com |
---|---|
State | New |
Headers | show |
Series | [committed] libstdc++: Simplify constraints for std::any construction [PR104242] | expand |
Oops, I meant to change the commit summary line to Un-simplify, since it was reverting the "Simplify constaints ..." commit. On Fri, 18 Mar 2022 at 15:43, Jonathan Wakely via Libstdc++ <libstdc++@gcc.gnu.org> wrote: > > Tested powerpc64le-linux, pushed to trunk, > > -- >8 -- > > Partially revert r12-4190-g6da36b7d0e43b6f9281c65c19a025d4888a25b2d > because using __and_<..., is_copy_constructible<T>> when T is incomplete > results in an error about deriving from is_copy_constructible<T> when > that is incomplete. I don't know how to fix that, so this simply > restores the previous constraint which worked in this case (even though > I think it's technically undefined to use is_copy_constructible<T> with > incomplete T). This doesn't restore exactly what we had before, but uses > the is_copy_constructible_v and __is_in_place_type_v variable templates > instead of the ::value member. > > libstdc++-v3/ChangeLog: > > PR libstdc++/104242 > * include/std/any (any(T&&)): Revert change to constraints. > * testsuite/20_util/any/cons/104242.cc: New test. > --- > libstdc++-v3/include/std/any | 4 ++-- > libstdc++-v3/testsuite/20_util/any/cons/104242.cc | 12 ++++++++++++ > 2 files changed, 14 insertions(+), 2 deletions(-) > create mode 100644 libstdc++-v3/testsuite/20_util/any/cons/104242.cc > > diff --git a/libstdc++-v3/include/std/any b/libstdc++-v3/include/std/any > index bdad76239b4..a6770e8f235 100644 > --- a/libstdc++-v3/include/std/any > +++ b/libstdc++-v3/include/std/any > @@ -185,8 +185,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > /// Construct with a copy of @p __value as the contained object. > template <typename _Tp, typename _VTp = _Decay_if_not_any<_Tp>, > typename _Mgr = _Manager<_VTp>, > - typename = _Require<__not_<__is_in_place_type<_VTp>>, > - is_copy_constructible<_VTp>>> > + enable_if_t<is_copy_constructible_v<_VTp> > + && !__is_in_place_type_v<_VTp>, bool> = true> > any(_Tp&& __value) > : _M_manager(&_Mgr::_S_manage) > { > diff --git a/libstdc++-v3/testsuite/20_util/any/cons/104242.cc b/libstdc++-v3/testsuite/20_util/any/cons/104242.cc > new file mode 100644 > index 00000000000..8d5868b7ff9 > --- /dev/null > +++ b/libstdc++-v3/testsuite/20_util/any/cons/104242.cc > @@ -0,0 +1,12 @@ > +// { dg-do compile { target c++17 } } > + > +// PR libstdc++/104242 - Class with constructor from std::any is not copyable > + > +#include <any> > +#include <type_traits> > + > +struct A { > + A(const A&) = default; > + explicit A(std::any value); > +}; > +static_assert(std::is_copy_constructible_v<A>); > -- > 2.34.1 >
diff --git a/libstdc++-v3/include/std/any b/libstdc++-v3/include/std/any index bdad76239b4..a6770e8f235 100644 --- a/libstdc++-v3/include/std/any +++ b/libstdc++-v3/include/std/any @@ -185,8 +185,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// Construct with a copy of @p __value as the contained object. template <typename _Tp, typename _VTp = _Decay_if_not_any<_Tp>, typename _Mgr = _Manager<_VTp>, - typename = _Require<__not_<__is_in_place_type<_VTp>>, - is_copy_constructible<_VTp>>> + enable_if_t<is_copy_constructible_v<_VTp> + && !__is_in_place_type_v<_VTp>, bool> = true> any(_Tp&& __value) : _M_manager(&_Mgr::_S_manage) { diff --git a/libstdc++-v3/testsuite/20_util/any/cons/104242.cc b/libstdc++-v3/testsuite/20_util/any/cons/104242.cc new file mode 100644 index 00000000000..8d5868b7ff9 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/any/cons/104242.cc @@ -0,0 +1,12 @@ +// { dg-do compile { target c++17 } } + +// PR libstdc++/104242 - Class with constructor from std::any is not copyable + +#include <any> +#include <type_traits> + +struct A { + A(const A&) = default; + explicit A(std::any value); +}; +static_assert(std::is_copy_constructible_v<A>);