tuple_cat.pass.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. // <tuple>
  10. // template <class... Types> class tuple;
  11. // template <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls);
  12. // UNSUPPORTED: c++98, c++03
  13. #include <tuple>
  14. #include <utility>
  15. #include <array>
  16. #include <string>
  17. #include <cassert>
  18. #include "test_macros.h"
  19. #include "MoveOnly.h"
  20. int main()
  21. {
  22. {
  23. std::tuple<> t = std::tuple_cat();
  24. ((void)t); // Prevent unused warning
  25. }
  26. {
  27. std::tuple<> t1;
  28. std::tuple<> t2 = std::tuple_cat(t1);
  29. ((void)t2); // Prevent unused warning
  30. }
  31. {
  32. std::tuple<> t = std::tuple_cat(std::tuple<>());
  33. ((void)t); // Prevent unused warning
  34. }
  35. {
  36. std::tuple<> t = std::tuple_cat(std::array<int, 0>());
  37. ((void)t); // Prevent unused warning
  38. }
  39. {
  40. std::tuple<int> t1(1);
  41. std::tuple<int> t = std::tuple_cat(t1);
  42. assert(std::get<0>(t) == 1);
  43. }
  44. #if TEST_STD_VER > 11
  45. {
  46. constexpr std::tuple<> t = std::tuple_cat();
  47. ((void)t); // Prevent unused warning
  48. }
  49. {
  50. constexpr std::tuple<> t1;
  51. constexpr std::tuple<> t2 = std::tuple_cat(t1);
  52. ((void)t2); // Prevent unused warning
  53. }
  54. {
  55. constexpr std::tuple<> t = std::tuple_cat(std::tuple<>());
  56. ((void)t); // Prevent unused warning
  57. }
  58. {
  59. constexpr std::tuple<> t = std::tuple_cat(std::array<int, 0>());
  60. ((void)t); // Prevent unused warning
  61. }
  62. {
  63. constexpr std::tuple<int> t1(1);
  64. constexpr std::tuple<int> t = std::tuple_cat(t1);
  65. static_assert(std::get<0>(t) == 1, "");
  66. }
  67. {
  68. constexpr std::tuple<int> t1(1);
  69. constexpr std::tuple<int, int> t = std::tuple_cat(t1, t1);
  70. static_assert(std::get<0>(t) == 1, "");
  71. static_assert(std::get<1>(t) == 1, "");
  72. }
  73. #endif
  74. {
  75. std::tuple<int, MoveOnly> t =
  76. std::tuple_cat(std::tuple<int, MoveOnly>(1, 2));
  77. assert(std::get<0>(t) == 1);
  78. assert(std::get<1>(t) == 2);
  79. }
  80. {
  81. std::tuple<int, int, int> t = std::tuple_cat(std::array<int, 3>());
  82. assert(std::get<0>(t) == 0);
  83. assert(std::get<1>(t) == 0);
  84. assert(std::get<2>(t) == 0);
  85. }
  86. {
  87. std::tuple<int, MoveOnly> t = std::tuple_cat(std::pair<int, MoveOnly>(2, 1));
  88. assert(std::get<0>(t) == 2);
  89. assert(std::get<1>(t) == 1);
  90. }
  91. {
  92. std::tuple<> t1;
  93. std::tuple<> t2;
  94. std::tuple<> t3 = std::tuple_cat(t1, t2);
  95. ((void)t3); // Prevent unused warning
  96. }
  97. {
  98. std::tuple<> t1;
  99. std::tuple<int> t2(2);
  100. std::tuple<int> t3 = std::tuple_cat(t1, t2);
  101. assert(std::get<0>(t3) == 2);
  102. }
  103. {
  104. std::tuple<> t1;
  105. std::tuple<int> t2(2);
  106. std::tuple<int> t3 = std::tuple_cat(t2, t1);
  107. assert(std::get<0>(t3) == 2);
  108. }
  109. {
  110. std::tuple<int*> t1;
  111. std::tuple<int> t2(2);
  112. std::tuple<int*, int> t3 = std::tuple_cat(t1, t2);
  113. assert(std::get<0>(t3) == nullptr);
  114. assert(std::get<1>(t3) == 2);
  115. }
  116. {
  117. std::tuple<int*> t1;
  118. std::tuple<int> t2(2);
  119. std::tuple<int, int*> t3 = std::tuple_cat(t2, t1);
  120. assert(std::get<0>(t3) == 2);
  121. assert(std::get<1>(t3) == nullptr);
  122. }
  123. {
  124. std::tuple<int*> t1;
  125. std::tuple<int, double> t2(2, 3.5);
  126. std::tuple<int*, int, double> t3 = std::tuple_cat(t1, t2);
  127. assert(std::get<0>(t3) == nullptr);
  128. assert(std::get<1>(t3) == 2);
  129. assert(std::get<2>(t3) == 3.5);
  130. }
  131. {
  132. std::tuple<int*> t1;
  133. std::tuple<int, double> t2(2, 3.5);
  134. std::tuple<int, double, int*> t3 = std::tuple_cat(t2, t1);
  135. assert(std::get<0>(t3) == 2);
  136. assert(std::get<1>(t3) == 3.5);
  137. assert(std::get<2>(t3) == nullptr);
  138. }
  139. {
  140. std::tuple<int*, MoveOnly> t1(nullptr, 1);
  141. std::tuple<int, double> t2(2, 3.5);
  142. std::tuple<int*, MoveOnly, int, double> t3 =
  143. std::tuple_cat(std::move(t1), t2);
  144. assert(std::get<0>(t3) == nullptr);
  145. assert(std::get<1>(t3) == 1);
  146. assert(std::get<2>(t3) == 2);
  147. assert(std::get<3>(t3) == 3.5);
  148. }
  149. {
  150. std::tuple<int*, MoveOnly> t1(nullptr, 1);
  151. std::tuple<int, double> t2(2, 3.5);
  152. std::tuple<int, double, int*, MoveOnly> t3 =
  153. std::tuple_cat(t2, std::move(t1));
  154. assert(std::get<0>(t3) == 2);
  155. assert(std::get<1>(t3) == 3.5);
  156. assert(std::get<2>(t3) == nullptr);
  157. assert(std::get<3>(t3) == 1);
  158. }
  159. {
  160. std::tuple<MoveOnly, MoveOnly> t1(1, 2);
  161. std::tuple<int*, MoveOnly> t2(nullptr, 4);
  162. std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 =
  163. std::tuple_cat(std::move(t1), std::move(t2));
  164. assert(std::get<0>(t3) == 1);
  165. assert(std::get<1>(t3) == 2);
  166. assert(std::get<2>(t3) == nullptr);
  167. assert(std::get<3>(t3) == 4);
  168. }
  169. {
  170. std::tuple<MoveOnly, MoveOnly> t1(1, 2);
  171. std::tuple<int*, MoveOnly> t2(nullptr, 4);
  172. std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 =
  173. std::tuple_cat(std::tuple<>(),
  174. std::move(t1),
  175. std::move(t2));
  176. assert(std::get<0>(t3) == 1);
  177. assert(std::get<1>(t3) == 2);
  178. assert(std::get<2>(t3) == nullptr);
  179. assert(std::get<3>(t3) == 4);
  180. }
  181. {
  182. std::tuple<MoveOnly, MoveOnly> t1(1, 2);
  183. std::tuple<int*, MoveOnly> t2(nullptr, 4);
  184. std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 =
  185. std::tuple_cat(std::move(t1),
  186. std::tuple<>(),
  187. std::move(t2));
  188. assert(std::get<0>(t3) == 1);
  189. assert(std::get<1>(t3) == 2);
  190. assert(std::get<2>(t3) == nullptr);
  191. assert(std::get<3>(t3) == 4);
  192. }
  193. {
  194. std::tuple<MoveOnly, MoveOnly> t1(1, 2);
  195. std::tuple<int*, MoveOnly> t2(nullptr, 4);
  196. std::tuple<MoveOnly, MoveOnly, int*, MoveOnly> t3 =
  197. std::tuple_cat(std::move(t1),
  198. std::move(t2),
  199. std::tuple<>());
  200. assert(std::get<0>(t3) == 1);
  201. assert(std::get<1>(t3) == 2);
  202. assert(std::get<2>(t3) == nullptr);
  203. assert(std::get<3>(t3) == 4);
  204. }
  205. {
  206. std::tuple<MoveOnly, MoveOnly> t1(1, 2);
  207. std::tuple<int*, MoveOnly> t2(nullptr, 4);
  208. std::tuple<MoveOnly, MoveOnly, int*, MoveOnly, int> t3 =
  209. std::tuple_cat(std::move(t1),
  210. std::move(t2),
  211. std::tuple<int>(5));
  212. assert(std::get<0>(t3) == 1);
  213. assert(std::get<1>(t3) == 2);
  214. assert(std::get<2>(t3) == nullptr);
  215. assert(std::get<3>(t3) == 4);
  216. assert(std::get<4>(t3) == 5);
  217. }
  218. {
  219. // See bug #19616.
  220. auto t1 = std::tuple_cat(
  221. std::make_tuple(std::make_tuple(1)),
  222. std::make_tuple()
  223. );
  224. assert(t1 == std::make_tuple(std::make_tuple(1)));
  225. auto t2 = std::tuple_cat(
  226. std::make_tuple(std::make_tuple(1)),
  227. std::make_tuple(std::make_tuple(2))
  228. );
  229. assert(t2 == std::make_tuple(std::make_tuple(1), std::make_tuple(2)));
  230. }
  231. }