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 <
[email protected]> wrote:
> On Tue, 21 Apr 2020 at 09:11, Ville Voutilainen
> <[email protected]> wrote:
> >
> > On Tue, 21 Apr 2020 at 04:10, kamlesh kumar <[email protected]>
> 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.
>