Added the fix for emplace. diff --git a/libstdc++-v3/include/std/any b/libstdc++-v3/include/std/any index 6b7e68f0e63..f35d90e548d 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> @@ -267,31 +254,34 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } /// Emplace with an object created from @p __args as the contained object. - template <typename _ValueType, typename... _Args> - typename __any_constructible<_Decay<_ValueType>&, - _Decay<_ValueType>, _Args&&...>::type + template <typename _ValueType, + typename... _Args, typename _Tp = decay_t<_ValueType>> + typename __any_constructible<_Tp&, + _Tp, _Args&&...>::type emplace(_Args&&... __args) { - __do_emplace<_Decay<_ValueType>>(std::forward<_Args>(__args)...); + __do_emplace<_Tp>(std::forward<_Args>(__args)...); any::_Arg __arg; this->_M_manager(any::_Op_access, this, &__arg); - return *static_cast<_Decay<_ValueType>*>(__arg._M_obj); + return *static_cast<_Tp*>(__arg._M_obj); } /// Emplace with an object created from @p __il and @p __args as /// the contained object. - template <typename _ValueType, typename _Up, typename... _Args> - typename __any_constructible<_Decay<_ValueType>&, - _Decay<_ValueType>, + template <typename _ValueType, + typename _Up, typename... _Args, + typename _Tp = decay_t<_ValueType>> + typename __any_constructible<_Tp&, + _Tp, initializer_list<_Up>, _Args&&...>::type emplace(initializer_list<_Up> __il, _Args&&... __args) { - __do_emplace<_Decay<_ValueType>, _Up>(__il, + __do_emplace<_Tp, _Up>(__il, std::forward<_Args>(__args)...); any::_Arg __arg; this->_M_manager(any::_Op_access, this, &__arg); - return *static_cast<_Decay<_ValueType>*>(__arg._M_obj); + return *static_cast<_Tp*>(__arg._M_obj); } // modifiers 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; +} + thanks, On Tue, Apr 21, 2020 at 12:09 PM Ville Voutilainen < ville.voutilai...@gmail.com> wrote: > On Tue, 21 Apr 2020 at 09:11, Ville Voutilainen > <ville.voutilai...@gmail.com> wrote: > > > > On Tue, 21 Apr 2020 at 04:10, kamlesh kumar <kamleshbha...@gmail.com> > wrote: > > > > > > Thank you for reviewing. > > > without _Decay to decay_t in the constructor which takes > inplace_type_t, > > > cases like this fails > > > auto a = std::any(std::in_place_type<std::any>, 5); > > > > > > for these constructors, standard does not say anything about > > > not-sameness checks with any. > > > https://en.cppreference.com/w/cpp/utility/any/any. > > > > Well, sure. Thus: > > - the in_place constructor should not _Decay > > - the constructor from T should _Decay > > - the assignment from a T should _Decay > > - emplace should not _Decay > > > > These bugs are not regressions, so presumably they can wait for stage1. > > ..except that two of them are. :) Anyhoo, the non-any handling needs > to be retained > for the T-constructor and the T-assignment, and removing it from > emplace is not a regression > but should be eventually done. >