1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <tuple> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class... Types> class tuple; 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 140e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant// template <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 16f063052fe1d3c7a40de69795228a6334f956b9f9Eric Fiselier// UNSUPPORTED: c++98, c++03 17f063052fe1d3c7a40de69795228a6334f956b9f9Eric Fiselier 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <tuple> 190e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant#include <utility> 200e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant#include <array> 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <string> 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 24e619862dbf0c4a46db6e3d816bcafcfef6e85977Stephan T. Lavavej#include "test_macros.h" 25df00d5e5ad672aa275a29c5a446072959134adddMarshall Clow#include "MoveOnly.h" 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 300e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<> t = std::tuple_cat(); 3175fdf0ea7c4894ddf713cb84a8ac57cc029c80bdEric Fiselier ((void)t); // Prevent unused warning 320e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 330e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 340e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<> t1; 350e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<> t2 = std::tuple_cat(t1); 3675fdf0ea7c4894ddf713cb84a8ac57cc029c80bdEric Fiselier ((void)t2); // Prevent unused warning 370e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 380e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 390e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<> t = std::tuple_cat(std::tuple<>()); 4075fdf0ea7c4894ddf713cb84a8ac57cc029c80bdEric Fiselier ((void)t); // Prevent unused warning 410e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 420e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 430e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<> t = std::tuple_cat(std::array<int, 0>()); 4475fdf0ea7c4894ddf713cb84a8ac57cc029c80bdEric Fiselier ((void)t); // Prevent unused warning 450e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 460e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 470e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<int> t1(1); 480e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<int> t = std::tuple_cat(t1); 490e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<0>(t) == 1); 500e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 51da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow 52e619862dbf0c4a46db6e3d816bcafcfef6e85977Stephan T. Lavavej#if TEST_STD_VER > 11 53da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow { 54da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow constexpr std::tuple<> t = std::tuple_cat(); 5575fdf0ea7c4894ddf713cb84a8ac57cc029c80bdEric Fiselier ((void)t); // Prevent unused warning 56da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow } 57da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow { 58da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow constexpr std::tuple<> t1; 59da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow constexpr std::tuple<> t2 = std::tuple_cat(t1); 6075fdf0ea7c4894ddf713cb84a8ac57cc029c80bdEric Fiselier ((void)t2); // Prevent unused warning 61da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow } 62da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow { 63da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow constexpr std::tuple<> t = std::tuple_cat(std::tuple<>()); 6475fdf0ea7c4894ddf713cb84a8ac57cc029c80bdEric Fiselier ((void)t); // Prevent unused warning 65da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow } 66da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow { 67da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow constexpr std::tuple<> t = std::tuple_cat(std::array<int, 0>()); 6875fdf0ea7c4894ddf713cb84a8ac57cc029c80bdEric Fiselier ((void)t); // Prevent unused warning 69da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow } 70da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow { 71da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow constexpr std::tuple<int> t1(1); 72da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow constexpr std::tuple<int> t = std::tuple_cat(t1); 73da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow static_assert(std::get<0>(t) == 1, ""); 74da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow } 75da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow { 76da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow constexpr std::tuple<int> t1(1); 77da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow constexpr std::tuple<int, int> t = std::tuple_cat(t1, t1); 78da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow static_assert(std::get<0>(t) == 1, ""); 79da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow static_assert(std::get<1>(t) == 1, ""); 80da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow } 81da0a0e8a1be285d18870955cffc1b51982675dd8Marshall Clow#endif 820e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 830e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<int, MoveOnly> t = 840e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple_cat(std::tuple<int, MoveOnly>(1, 2)); 850e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<0>(t) == 1); 860e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<1>(t) == 2); 870e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 880e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 890e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<int, int, int> t = std::tuple_cat(std::array<int, 3>()); 900e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<0>(t) == 0); 910e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<1>(t) == 0); 920e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<2>(t) == 0); 930e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 940e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 950e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<int, MoveOnly> t = std::tuple_cat(std::pair<int, MoveOnly>(2, 1)); 960e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<0>(t) == 2); 970e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<1>(t) == 1); 980e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 990e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant 1000e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<> t1; 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<> t2; 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<> t3 = std::tuple_cat(t1, t2); 10475fdf0ea7c4894ddf713cb84a8ac57cc029c80bdEric Fiselier ((void)t3); // Prevent unused warning 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<> t1; 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int> t2(2); 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int> t3 = std::tuple_cat(t1, t2); 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t3) == 2); 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<> t1; 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int> t2(2); 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int> t3 = std::tuple_cat(t2, t1); 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t3) == 2); 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int*> t1; 120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int> t2(2); 121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int*, int> t3 = std::tuple_cat(t1, t2); 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t3) == nullptr); 123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t3) == 2); 124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int*> t1; 127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int> t2(2); 128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int, int*> t3 = std::tuple_cat(t2, t1); 129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t3) == 2); 130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t3) == nullptr); 131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int*> t1; 134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int, double> t2(2, 3.5); 135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int*, int, double> t3 = std::tuple_cat(t1, t2); 136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t3) == nullptr); 137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t3) == 2); 138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<2>(t3) == 3.5); 139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int*> t1; 142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int, double> t2(2, 3.5); 143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int, double, int*> t3 = std::tuple_cat(t2, t1); 144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t3) == 2); 145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t3) == 3.5); 146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<2>(t3) == nullptr); 147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int*, MoveOnly> t1(nullptr, 1); 150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int, double> t2(2, 3.5); 151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int*, MoveOnly, int, double> t3 = 152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple_cat(std::move(t1), t2); 153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t3) == nullptr); 154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t3) == 1); 155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<2>(t3) == 2); 156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<3>(t3) == 3.5); 157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int*, MoveOnly> t1(nullptr, 1); 160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int, double> t2(2, 3.5); 161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int, double, int*, MoveOnly> t3 = 162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple_cat(t2, std::move(t1)); 163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t3) == 2); 164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t3) == 3.5); 165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<2>(t3) == nullptr); 166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<3>(t3) == 1); 167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<MoveOnly, MoveOnly> t1(1, 2); 170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int*, MoveOnly> t2(nullptr, 4); 171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 = 172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple_cat(std::move(t1), std::move(t2)); 173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t3) == 1); 174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t3) == 2); 175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<2>(t3) == nullptr); 176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<3>(t3) == 4); 177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 1780e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant 1790e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 1800e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<MoveOnly, MoveOnly> t1(1, 2); 1810e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<int*, MoveOnly> t2(nullptr, 4); 1820e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 = 1830e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple_cat(std::tuple<>(), 1840e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::move(t1), 1850e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::move(t2)); 1860e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<0>(t3) == 1); 1870e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<1>(t3) == 2); 1880e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<2>(t3) == nullptr); 1890e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<3>(t3) == 4); 1900e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 1910e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 1920e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<MoveOnly, MoveOnly> t1(1, 2); 1930e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<int*, MoveOnly> t2(nullptr, 4); 1940e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 = 1950e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple_cat(std::move(t1), 1960e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<>(), 1970e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::move(t2)); 1980e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<0>(t3) == 1); 1990e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<1>(t3) == 2); 2000e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<2>(t3) == nullptr); 2010e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<3>(t3) == 4); 2020e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 2030e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 2040e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<MoveOnly, MoveOnly> t1(1, 2); 2050e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<int*, MoveOnly> t2(nullptr, 4); 2060e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 = 2070e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple_cat(std::move(t1), 2080e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::move(t2), 2090e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<>()); 2100e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<0>(t3) == 1); 2110e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<1>(t3) == 2); 2120e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<2>(t3) == nullptr); 2130e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<3>(t3) == 4); 2140e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 2150e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant { 2160e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<MoveOnly, MoveOnly> t1(1, 2); 2170e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<int*, MoveOnly> t2(nullptr, 4); 2180e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<MoveOnly, MoveOnly, int*, MoveOnly, int> t3 = 2190e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple_cat(std::move(t1), 2200e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::move(t2), 2210e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant std::tuple<int>(5)); 2220e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<0>(t3) == 1); 2230e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<1>(t3) == 2); 2240e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<2>(t3) == nullptr); 2250e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<3>(t3) == 4); 2260e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant assert(std::get<4>(t3) == 5); 2270e1493ec5e125adfb7531b2a05c26bff26325cb2Howard Hinnant } 228df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow { 229df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow // See bug #19616. 230df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow auto t1 = std::tuple_cat( 231df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow std::make_tuple(std::make_tuple(1)), 232df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow std::make_tuple() 233df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow ); 234df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow assert(t1 == std::make_tuple(std::make_tuple(1))); 235df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow 236df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow auto t2 = std::tuple_cat( 237df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow std::make_tuple(std::make_tuple(1)), 238df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow std::make_tuple(std::make_tuple(2)) 239df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow ); 240df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow assert(t2 == std::make_tuple(std::make_tuple(1), std::make_tuple(2))); 241df9722ecf1c1bdffe53f5eff23120647193f033fMarshall Clow } 242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 243