Commit b7021006 by Ville Voutilainen Committed by Ville Voutilainen

re PR libstdc++/66338 (std::forward_as_tuple() issue with single argument)

2016-05-24  Ville Voutilainen  <ville.voutilainen@gmail.com>

	PR libstdc++/66338
	* include/std/tuple (_TMC): Add a check for _NotSameTuple.
	* include/std/tuple (tuple(_UElements&&...)): Remove the separate
	check for _NotSameTuple.
	* include/std/tuple (_TMCT): New.
	* include/std/tuple (tuple(const tuple<_UElements...>&)): Use it.
	* include/std/tuple (tuple(tuple<_UElements...>&&)): Likewise.
	* include/std/tuple (tuple(allocator_arg_t, const _Alloc&,
	      const tuple<_UElements...>&)): Likewise.
	* include/std/tuple (tuple(allocator_arg_t, const _Alloc&,
	      tuple<_UElements...>&&)): Likewise.
	* testsuite/20_util/tuple/cons/66338.cc: New.

From-SVN: r236822
parent f2879a90
2016-05-27 Ville Voutilainen <ville.voutilainen@gmail.com>
PR libstdc++/66338
* include/std/tuple (_TMC): Add a check for _NotSameTuple.
* include/std/tuple (tuple(_UElements&&...)): Remove the separate
check for _NotSameTuple.
* include/std/tuple (_TMCT): New.
* include/std/tuple (tuple(const tuple<_UElements...>&)): Use it.
* include/std/tuple (tuple(tuple<_UElements...>&&)): Likewise.
* include/std/tuple (tuple(allocator_arg_t, const _Alloc&,
const tuple<_UElements...>&)): Likewise.
* include/std/tuple (tuple(allocator_arg_t, const _Alloc&,
tuple<_UElements...>&&)): Likewise.
* testsuite/20_util/tuple/cons/66338.cc: New.
2016-05-25 Jonathan Wakely <jwakely@redhat.com> 2016-05-25 Jonathan Wakely <jwakely@redhat.com>
* acinclude.m4 (GLIBCXX_CHECK_FILESYSTEM_DEPS): Fix test for sendfile. * acinclude.m4 (GLIBCXX_CHECK_FILESYSTEM_DEPS): Fix test for sendfile.
......
...@@ -620,14 +620,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -620,14 +620,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Shortcut for the cases where constructors taking _UElements... // Shortcut for the cases where constructors taking _UElements...
// need to be constrained. // need to be constrained.
template<typename... _UElements> using _TMC = template<typename... _UElements> using _TMC =
_TC<(sizeof...(_Elements) == sizeof...(_UElements)), _TC<(sizeof...(_Elements) == sizeof...(_UElements))
&& (_TC<(sizeof...(_UElements)==1), _Elements...>::
template _NotSameTuple<_UElements...>()),
_Elements...>;
// Shortcut for the cases where constructors taking tuple<_UElements...>
// need to be constrained.
template<typename... _UElements> using _TMCT =
_TC<(sizeof...(_Elements) == sizeof...(_UElements))
&& !is_same<tuple<Elements...>,
tuple<_UElements...>>::value,
_Elements...>; _Elements...>;
template<typename... _UElements, typename template<typename... _UElements, typename
enable_if< enable_if<
_TC<sizeof...(_UElements) == 1, _Elements...>::template _TMC<_UElements...>::template
_NotSameTuple<_UElements...>()
&& _TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>() _MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template && _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>() _ImplicitlyMoveConvertibleTuple<_UElements...>()
...@@ -638,9 +646,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -638,9 +646,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename... _UElements, typename template<typename... _UElements, typename
enable_if< enable_if<
_TC<sizeof...(_UElements) == 1, _Elements...>::template _TMC<_UElements...>::template
_NotSameTuple<_UElements...>()
&& _TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>() _MoveConstructibleTuple<_UElements...>()
&& !_TMC<_UElements...>::template && !_TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>() _ImplicitlyMoveConvertibleTuple<_UElements...>()
...@@ -660,9 +666,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -660,9 +666,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_Elements...>; _Elements...>;
template<typename... _UElements, typename _Dummy = void, typename template<typename... _UElements, typename _Dummy = void, typename
enable_if<_TMC<_UElements...>::template enable_if<_TMCT<_UElements...>::template
_ConstructibleTuple<_UElements...>() _ConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template && _TMCT<_UElements...>::template
_ImplicitlyConvertibleTuple<_UElements...>() _ImplicitlyConvertibleTuple<_UElements...>()
&& _TNTC<_Dummy>::template && _TNTC<_Dummy>::template
_NonNestedTuple<const tuple<_UElements...>&>(), _NonNestedTuple<const tuple<_UElements...>&>(),
...@@ -672,9 +678,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -672,9 +678,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ } { }
template<typename... _UElements, typename _Dummy = void, typename template<typename... _UElements, typename _Dummy = void, typename
enable_if<_TMC<_UElements...>::template enable_if<_TMCT<_UElements...>::template
_ConstructibleTuple<_UElements...>() _ConstructibleTuple<_UElements...>()
&& !_TMC<_UElements...>::template && !_TMCT<_UElements...>::template
_ImplicitlyConvertibleTuple<_UElements...>() _ImplicitlyConvertibleTuple<_UElements...>()
&& _TNTC<_Dummy>::template && _TNTC<_Dummy>::template
_NonNestedTuple<const tuple<_UElements...>&>(), _NonNestedTuple<const tuple<_UElements...>&>(),
...@@ -684,9 +690,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -684,9 +690,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ } { }
template<typename... _UElements, typename _Dummy = void, typename template<typename... _UElements, typename _Dummy = void, typename
enable_if<_TMC<_UElements...>::template enable_if<_TMCT<_UElements...>::template
_MoveConstructibleTuple<_UElements...>() _MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template && _TMCT<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>() _ImplicitlyMoveConvertibleTuple<_UElements...>()
&& _TNTC<_Dummy>::template && _TNTC<_Dummy>::template
_NonNestedTuple<tuple<_UElements...>&&>(), _NonNestedTuple<tuple<_UElements...>&&>(),
...@@ -695,9 +701,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -695,9 +701,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
: _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { } : _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { }
template<typename... _UElements, typename _Dummy = void, typename template<typename... _UElements, typename _Dummy = void, typename
enable_if<_TMC<_UElements...>::template enable_if<_TMCT<_UElements...>::template
_MoveConstructibleTuple<_UElements...>() _MoveConstructibleTuple<_UElements...>()
&& !_TMC<_UElements...>::template && !_TMCT<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>() _ImplicitlyMoveConvertibleTuple<_UElements...>()
&& _TNTC<_Dummy>::template && _TNTC<_Dummy>::template
_NonNestedTuple<tuple<_UElements...>&&>(), _NonNestedTuple<tuple<_UElements...>&&>(),
...@@ -764,9 +770,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -764,9 +770,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
: _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { } : _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { }
template<typename _Alloc, typename... _UElements, typename template<typename _Alloc, typename... _UElements, typename
enable_if<_TMC<_UElements...>::template enable_if<_TMCT<_UElements...>::template
_ConstructibleTuple<_UElements...>() _ConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template && _TMCT<_UElements...>::template
_ImplicitlyConvertibleTuple<_UElements...>(), _ImplicitlyConvertibleTuple<_UElements...>(),
bool>::type=true> bool>::type=true>
tuple(allocator_arg_t __tag, const _Alloc& __a, tuple(allocator_arg_t __tag, const _Alloc& __a,
...@@ -776,9 +782,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -776,9 +782,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ } { }
template<typename _Alloc, typename... _UElements, typename template<typename _Alloc, typename... _UElements, typename
enable_if<_TMC<_UElements...>::template enable_if<_TMCT<_UElements...>::template
_ConstructibleTuple<_UElements...>() _ConstructibleTuple<_UElements...>()
&& !_TMC<_UElements...>::template && !_TMCT<_UElements...>::template
_ImplicitlyConvertibleTuple<_UElements...>(), _ImplicitlyConvertibleTuple<_UElements...>(),
bool>::type=false> bool>::type=false>
explicit tuple(allocator_arg_t __tag, const _Alloc& __a, explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
...@@ -788,9 +794,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -788,9 +794,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ } { }
template<typename _Alloc, typename... _UElements, typename template<typename _Alloc, typename... _UElements, typename
enable_if<_TMC<_UElements...>::template enable_if<_TMCT<_UElements...>::template
_MoveConstructibleTuple<_UElements...>() _MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template && _TMCT<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>(), _ImplicitlyMoveConvertibleTuple<_UElements...>(),
bool>::type=true> bool>::type=true>
tuple(allocator_arg_t __tag, const _Alloc& __a, tuple(allocator_arg_t __tag, const _Alloc& __a,
...@@ -800,9 +806,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -800,9 +806,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ } { }
template<typename _Alloc, typename... _UElements, typename template<typename _Alloc, typename... _UElements, typename
enable_if<_TMC<_UElements...>::template enable_if<_TMCT<_UElements...>::template
_MoveConstructibleTuple<_UElements...>() _MoveConstructibleTuple<_UElements...>()
&& !_TMC<_UElements...>::template && !_TMCT<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>(), _ImplicitlyMoveConvertibleTuple<_UElements...>(),
bool>::type=false> bool>::type=false>
explicit tuple(allocator_arg_t __tag, const _Alloc& __a, explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
......
// Copyright (C) 2016 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 <tuple>
struct S {
int i_;
template<typename T>
S(T&& i)
noexcept(noexcept(i_ = i))
{ i_ = i; }
S() noexcept : i_{0} {};
};
int main()
{
std::tuple<S&&>(std::forward_as_tuple(S{}));
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment