From 7e528bc4ce51daae5b90bf641f15ea564901de8b Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Fri, 26 Apr 2019 01:02:18 +0000 Subject: [PATCH] Fix return type of std::tuple_cat. When the arguments to tuple cat were const, the const was incorrectly propagated into the type of the resulting tuple. For example: const std::tuple t(42); auto r = std::tuple_cat(t, t); // Incorrect! should be std::tuple. static_assert(is_same_v>); llvm-svn: 359255 --- libcxx/include/tuple | 4 ++-- .../tuple/tuple.tuple/tuple.creation/tuple_cat.pass.cpp | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/libcxx/include/tuple b/libcxx/include/tuple index 335e59e..7437d5c 100644 --- a/libcxx/include/tuple +++ b/libcxx/include/tuple @@ -1211,7 +1211,7 @@ template struct __tuple_cat_return_1, true, _Tuple0> { typedef typename __tuple_cat_type, - typename __make_tuple_types::type>::type>::type + typename __make_tuple_types::type>::type>::type type; }; @@ -1220,7 +1220,7 @@ struct __tuple_cat_return_1, true, _Tuple0, _Tuple1, _Tuples... : public __tuple_cat_return_1< typename __tuple_cat_type< tuple<_Types...>, - typename __make_tuple_types::type>::type + typename __make_tuple_types::type>::type >::type, __tuple_like::type>::value, _Tuple1, _Tuples...> diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.creation/tuple_cat.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.creation/tuple_cat.pass.cpp index 40efbd1..5d5927d 100644 --- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.creation/tuple_cat.pass.cpp +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.creation/tuple_cat.pass.cpp @@ -238,6 +238,21 @@ int main(int, char**) ); assert(t2 == std::make_tuple(std::make_tuple(1), std::make_tuple(2))); } + { + int x = 101; + std::tuple t(42, x, x, std::move(x)); + const auto& ct = t; + std::tuple t2(42, x, x); + const auto& ct2 = t2; + + auto r = std::tuple_cat(std::move(t), std::move(ct), t2, ct2); + ASSERT_SAME_TYPE(decltype(r), std::tuple< + int, int&, const int&, int&&, + int, int&, const int&, int&&, + int, int&, const int&, + int, int&, const int&>); + ((void)r); + } return 0; } -- 2.7.4