On Fri, Apr 17, 2020, 10:59 PM kamlesh kumar <kamleshbha...@gmail.com> wrote:
> Fixes all this. > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92156 > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91630 > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90415 > > On Fri, Apr 17, 2020 at 10:45 PM kamlesh kumar <kamleshbha...@gmail.com> > wrote: > > > > This patch corrects the requirement of 4,5 and 6th constructor > > As per https://en.cppreference.com/w/cpp/utility/any/any. > > > > ChangeLog: > > 2020-04-17 Kamlesh Kumar <kamleshbha...@gmail.com> > > > > PR libstdc++/92156 > > * include/std/any (ans::any(_ValueType &&):: Remove > is_constructible. > > (any::any(in_place_type_t<_ValueType>, _Args&&...)): Use decay_t. > > (any::any(in_place_type_t<_ValueType>,initializer_list<_Up>, > _Args&&...)): > > Use decay_t. > > * testsuite/20_util/any/misc/92156.cc: New Test. > > > > diff --git a/libstdc++-v3/include/std/any b/libstdc++-v3/include/std/any > > index 6b7e68f0e63..fb212eb2231 100644 > > --- a/libstdc++-v3/include/std/any > > +++ b/libstdc++-v3/include/std/any > > @@ -178,30 +178,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > /// Construct with a copy of @p __value as the contained object. > > template <typename _ValueType, typename _Tp = _Decay<_ValueType>, > > typename _Mgr = _Manager<_Tp>, > > - __any_constructible_t<_Tp, _ValueType&&> = true, > > - enable_if_t<!__is_in_place_type<_Tp>::value, bool> = true> > > + enable_if_t<is_copy_constructible<_Tp>::value && > > + !__is_in_place_type<_Tp>::value, bool> = true> > > any(_ValueType&& __value) > > : _M_manager(&_Mgr::_S_manage) > > { > > _Mgr::_S_create(_M_storage, std::forward<_ValueType>(__value)); > > } > > > > - /// Construct with a copy of @p __value as the contained object. > > - template <typename _ValueType, typename _Tp = _Decay<_ValueType>, > > - typename _Mgr = _Manager<_Tp>, > > - enable_if_t<__and_v<is_copy_constructible<_Tp>, > > - __not_<is_constructible<_Tp, _ValueType&&>>, > > - __not_<__is_in_place_type<_Tp>>>, > > - bool> = false> > > - any(_ValueType&& __value) > > - : _M_manager(&_Mgr::_S_manage) > > - { > > - _Mgr::_S_create(_M_storage, __value); > > - } > > - > > /// Construct with an object created from @p __args as the > contained object. > > template <typename _ValueType, typename... _Args, > > - typename _Tp = _Decay<_ValueType>, > > + typename _Tp = decay_t<_ValueType>, > > typename _Mgr = _Manager<_Tp>, > > __any_constructible_t<_Tp, _Args&&...> = false> > > explicit > > @@ -214,7 +201,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > /// Construct with an object created from @p __il and @p __args as > > /// the contained object. > > template <typename _ValueType, typename _Up, typename... _Args, > > - typename _Tp = _Decay<_ValueType>, > > + typename _Tp = decay_t<_ValueType>, > > typename _Mgr = _Manager<_Tp>, > > __any_constructible_t<_Tp, initializer_list<_Up>, > > _Args&&...> = false> > > diff --git a/libstdc++-v3/testsuite/20_util/any/misc/92156.cc > b/libstdc++-v3/testsuite/20_util/any/misc/92156.cc > > new file mode 100644 > > index 00000000000..c4f1ed55aee > > --- /dev/null > > +++ b/libstdc++-v3/testsuite/20_util/any/misc/92156.cc > > @@ -0,0 +1,34 @@ > > +// { dg-options "-std=gnu++17" } > > +// { dg-do compile } > > + > > +// Copyright (C) 2014-2020 Free Software Foundation, Inc. > > +// > > +// This file is part of the GNU ISO C++ Library. This library is free > > +// software; you can redistribute it and/or modify it under the > > +// terms of the GNU General Public License as published by the > > +// Free Software Foundation; either version 3, or (at your option) > > +// any later version. > > + > > +// This library is distributed in the hope that it will be useful, > > +// but WITHOUT ANY WARRANTY; without even the implied warranty of > > +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +// GNU General Public License for more details. > > + > > +// You should have received a copy of the GNU General Public License > along > > +// with this library; see the file COPYING3. If not see > > +// <http://www.gnu.org/licenses/>. > > + > > +#include <any> > > +#include <utility> > > +#include <tuple> > > + > > +int main() { > > + auto a = std::any(std::in_place_type<std::any>, 5); > > + auto b = std::any(std::in_place_type<std::any>, {1}); > > + std::any p = std::pair<std::any, std::any>(1, 1); > > + (void)p; > > + std::any t = std::tuple<std::any>(1); > > + (void)t; > > + return 0; > > +} > > + > > > > Regtested on X86_64-linux. > > > > Thanks, > > >