xref: /llvm-project/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/recursion_depth.pass.cpp (revision 0106ae3cce01b88a87acfa9cae823ed4990b907e)
184f0bb61SLouis Dionne //===----------------------------------------------------------------------===//
284f0bb61SLouis Dionne //
384f0bb61SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
484f0bb61SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
584f0bb61SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
684f0bb61SLouis Dionne //
784f0bb61SLouis Dionne //===----------------------------------------------------------------------===//
884f0bb61SLouis Dionne 
984f0bb61SLouis Dionne // UNSUPPORTED: c++03, c++11
1084f0bb61SLouis Dionne 
1184f0bb61SLouis Dionne // Make sure that we don't blow up the template instantiation recursion depth
12*0106ae3cSLouis Dionne // for tuples of size <= 512.
1384f0bb61SLouis Dionne 
1484f0bb61SLouis Dionne #include <tuple>
1584f0bb61SLouis Dionne #include <cassert>
1684f0bb61SLouis Dionne #include <utility>
1784f0bb61SLouis Dionne 
18*0106ae3cSLouis Dionne #include "test_macros.h"
19*0106ae3cSLouis Dionne 
20fb855eb9SMark de Wever template <std::size_t... I>
CreateTuple(std::index_sequence<I...>)2184f0bb61SLouis Dionne constexpr void CreateTuple(std::index_sequence<I...>) {
22*0106ae3cSLouis Dionne   using LargeTuple = std::tuple<std::integral_constant<std::size_t, I>...>;
23*0106ae3cSLouis Dionne   using TargetTuple = std::tuple<decltype(I)...>;
24*0106ae3cSLouis Dionne   LargeTuple tuple(std::integral_constant<std::size_t, I>{}...);
25*0106ae3cSLouis Dionne   assert(std::get<0>(tuple).value == 0);
26*0106ae3cSLouis Dionne   assert(std::get<sizeof...(I)-1>(tuple).value == sizeof...(I)-1);
27*0106ae3cSLouis Dionne 
28*0106ae3cSLouis Dionne   TargetTuple t1 = tuple;                                  // converting copy constructor from &
29*0106ae3cSLouis Dionne   TargetTuple t2 = static_cast<LargeTuple const&>(tuple);  // converting copy constructor from const&
30*0106ae3cSLouis Dionne   TargetTuple t3 = std::move(tuple);                       // converting rvalue constructor
31*0106ae3cSLouis Dionne   TargetTuple t4 = static_cast<LargeTuple const&&>(tuple); // converting const rvalue constructor
32*0106ae3cSLouis Dionne   TargetTuple t5;                                          // default constructor
33*0106ae3cSLouis Dionne   (void)t1; (void)t2; (void)t3; (void)t4; (void)t5;
34*0106ae3cSLouis Dionne 
35*0106ae3cSLouis Dionne #if TEST_STD_VER >= 20
36*0106ae3cSLouis Dionne   t1 = tuple;                                              // converting assignment from &
37*0106ae3cSLouis Dionne   t1 = static_cast<LargeTuple const&>(tuple);              // converting assignment from const&
38*0106ae3cSLouis Dionne   t1 = std::move(tuple);                                   // converting assignment from &&
39*0106ae3cSLouis Dionne   t1 = static_cast<LargeTuple const&&>(tuple);             // converting assignment from const&&
40*0106ae3cSLouis Dionne   swap(t1, t2);                                            // swap
41*0106ae3cSLouis Dionne #endif
42*0106ae3cSLouis Dionne   // t1 == tuple;                                          // comparison does not work yet (we blow the constexpr stack)
4384f0bb61SLouis Dionne }
4484f0bb61SLouis Dionne 
test()4584f0bb61SLouis Dionne constexpr bool test() {
46*0106ae3cSLouis Dionne   CreateTuple(std::make_index_sequence<512>{});
4784f0bb61SLouis Dionne   return true;
4884f0bb61SLouis Dionne }
4984f0bb61SLouis Dionne 
main(int,char **)5084f0bb61SLouis Dionne int main(int, char**) {
5184f0bb61SLouis Dionne   test();
5284f0bb61SLouis Dionne   static_assert(test(), "");
5384f0bb61SLouis Dionne   return 0;
5484f0bb61SLouis Dionne }
55