aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorVille Voutilainen <ville.voutilainen@gmail.com>2016-06-05 20:39:10 +0300
committerVille Voutilainen <ville@gcc.gnu.org>2016-06-05 20:39:10 +0300
commit7a66745357510da6a18759839e4d8fc4715166a0 (patch)
tree109cc8e6e390f10f2dd43532ae7ba194cfaf4780 /libstdc++-v3
parentb2d83bd2c78021ed68b04c9d426925ef947dddaf (diff)
downloadgcc-7a66745357510da6a18759839e4d8fc4715166a0.zip
gcc-7a66745357510da6a18759839e4d8fc4715166a0.tar.gz
gcc-7a66745357510da6a18759839e4d8fc4715166a0.tar.bz2
Protect allocator-overloads of tuple-from-tuple constructors from cases that would create dangling references.
Protect allocator-overloads of tuple-from-tuple constructors from cases that would create dangling references. * include/std/tuple (tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&), tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&)): Add a check for _NonNestedTuple. * testsuite/20_util/tuple/cons/nested_tuple_construct.cc: Adjust. From-SVN: r237106
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog9
-rw-r--r--libstdc++-v3/include/std/tuple28
-rw-r--r--libstdc++-v3/testsuite/20_util/tuple/cons/nested_tuple_construct.cc35
3 files changed, 64 insertions, 8 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 488af9f..8ff4d16 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,12 @@
+2016-06-05 Ville Voutilainen <ville.voutilainen@gmail.com>
+
+ Protect allocator-overloads of tuple-from-tuple constructors
+ from cases that would create dangling references.
+ * include/std/tuple (tuple(allocator_arg_t, const _Alloc&,
+ const tuple<_UElements...>&), tuple(allocator_arg_t, const _Alloc&,
+ tuple<_UElements...>&&)): Add a check for _NonNestedTuple.
+ * testsuite/20_util/tuple/cons/nested_tuple_construct.cc: Adjust.
+
2016-05-29 Gerald Pfeifer <gerald@pfeifer.com>
* doc/xml/manual/backwards_compatibility.xml: Adjust
diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple
index ea88793..17c8204 100644
--- a/libstdc++-v3/include/std/tuple
+++ b/libstdc++-v3/include/std/tuple
@@ -769,11 +769,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
: _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { }
- template<typename _Alloc, typename... _UElements, typename
+ template<typename _Alloc, typename _Dummy = void,
+ typename... _UElements, typename
enable_if<_TMCT<_UElements...>::template
_ConstructibleTuple<_UElements...>()
&& _TMCT<_UElements...>::template
- _ImplicitlyConvertibleTuple<_UElements...>(),
+ _ImplicitlyConvertibleTuple<_UElements...>()
+ && _TNTC<_Dummy>::template
+ _NonNestedTuple<tuple<_UElements...>&&>(),
bool>::type=true>
tuple(allocator_arg_t __tag, const _Alloc& __a,
const tuple<_UElements...>& __in)
@@ -781,11 +784,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
{ }
- template<typename _Alloc, typename... _UElements, typename
+ template<typename _Alloc, typename _Dummy = void,
+ typename... _UElements, typename
enable_if<_TMCT<_UElements...>::template
_ConstructibleTuple<_UElements...>()
&& !_TMCT<_UElements...>::template
- _ImplicitlyConvertibleTuple<_UElements...>(),
+ _ImplicitlyConvertibleTuple<_UElements...>()
+ && _TNTC<_Dummy>::template
+ _NonNestedTuple<tuple<_UElements...>&&>(),
bool>::type=false>
explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
const tuple<_UElements...>& __in)
@@ -793,11 +799,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
{ }
- template<typename _Alloc, typename... _UElements, typename
+ template<typename _Alloc, typename _Dummy = void,
+ typename... _UElements, typename
enable_if<_TMCT<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMCT<_UElements...>::template
- _ImplicitlyMoveConvertibleTuple<_UElements...>(),
+ _ImplicitlyMoveConvertibleTuple<_UElements...>()
+ && _TNTC<_Dummy>::template
+ _NonNestedTuple<tuple<_UElements...>&&>(),
bool>::type=true>
tuple(allocator_arg_t __tag, const _Alloc& __a,
tuple<_UElements...>&& __in)
@@ -805,11 +814,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static_cast<_Tuple_impl<0, _UElements...>&&>(__in))
{ }
- template<typename _Alloc, typename... _UElements, typename
+ template<typename _Alloc, typename _Dummy = void,
+ typename... _UElements, typename
enable_if<_TMCT<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& !_TMCT<_UElements...>::template
- _ImplicitlyMoveConvertibleTuple<_UElements...>(),
+ _ImplicitlyMoveConvertibleTuple<_UElements...>()
+ && _TNTC<_Dummy>::template
+ _NonNestedTuple<tuple<_UElements...>&&>(),
bool>::type=false>
explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
tuple<_UElements...>&& __in)
diff --git a/libstdc++-v3/testsuite/20_util/tuple/cons/nested_tuple_construct.cc b/libstdc++-v3/testsuite/20_util/tuple/cons/nested_tuple_construct.cc
index 39a4f73..7f64239 100644
--- a/libstdc++-v3/testsuite/20_util/tuple/cons/nested_tuple_construct.cc
+++ b/libstdc++-v3/testsuite/20_util/tuple/cons/nested_tuple_construct.cc
@@ -63,6 +63,32 @@ void f3()
std::tuple<std::tuple<X>> t3{std::move(t2)};
}
+void f4()
+{
+ std::allocator<X> a;
+ X v;
+ std::tuple<X> t1{std::allocator_arg, a, v};
+ std::tuple<std::tuple<X>&&> t2{std::allocator_arg, a, std::move(t1)};
+ std::tuple<std::tuple<X>> t3{std::allocator_arg, a, std::move(t2)};
+}
+
+void f5()
+{
+ std::allocator<X> a;
+ X v;
+ std::tuple<X> t1{std::allocator_arg, a, std::move(v)};
+ std::tuple<std::tuple<X>&&> t2{std::allocator_arg, a, std::move(t1)};
+ std::tuple<std::tuple<X>> t3{std::allocator_arg, a, std::move(t2)};
+}
+
+void f6()
+{
+ std::allocator<X> a;
+ std::tuple<X> t1{std::allocator_arg, a, X{}};
+ std::tuple<std::tuple<X>&&> t2{std::allocator_arg, a, std::move(t1)};
+ std::tuple<std::tuple<X>> t3{std::allocator_arg, a, std::move(t2)};
+}
+
int main()
{
f();
@@ -74,4 +100,13 @@ int main()
f3();
VERIFY(result == "DefMoveDtorMoveDtorDtor");
result = "";
+ f4();
+ VERIFY(result == "DefCopyMoveDtorDtorDtor");
+ result = "";
+ f5();
+ VERIFY(result == "DefMoveMoveDtorDtorDtor");
+ result = "";
+ f6();
+ VERIFY(result == "DefMoveDtorMoveDtorDtor");
+ result = "";
}