]> git.ipfire.org Git - thirdparty/gcc.git/blame_incremental - libstdc++-v3/testsuite/20_util/tuple/creation_functions/constexpr.cc
[vxworks] [ppc] match TARGET_VXWORKS64 to TARGET_64BIT
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 20_util / tuple / creation_functions / constexpr.cc
... / ...
CommitLineData
1// { dg-do compile { target c++11 } }
2
3// Copyright (C) 2011-2025 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING3. If not see
18// <http://www.gnu.org/licenses/>.
19
20
21// NOTE: This makes use of the fact that we know how moveable
22// is implemented on pair, and also vector. If the implementation
23// changes this test may begin to fail.
24
25#include <tuple>
26
27// make_tuple
28void
29test_make_tuple()
30{
31 {
32 typedef std::tuple<int, float> tuple_type;
33 constexpr tuple_type p1 __attribute__((unused))
34 = std::make_tuple(22, 22.222);
35 }
36
37 {
38 typedef std::tuple<int, float, int> tuple_type;
39 constexpr tuple_type p1 __attribute__((unused))
40 = std::make_tuple(22, 22.222, 77799);
41 }
42}
43
44// forward_as_tuple
45void
46test_forward_as_tuple()
47{
48 {
49 static int i(22);
50 static float f(22.222);
51 typedef std::tuple<int&, float&&> tuple_type;
52 constexpr tuple_type p1 __attribute__((unused))
53 = std::forward_as_tuple(i, std::move(f));
54 }
55
56 {
57 static int i(22);
58 static float f(22.222);
59 static int ii(77799);
60
61 typedef std::tuple<int&, float&, int&&> tuple_type;
62 constexpr tuple_type p1 __attribute__((unused))
63 = std::forward_as_tuple(i, f, std::move(ii));
64 }
65}
66
67// tie
68void
69test_tie()
70{
71 {
72 static int i(22);
73 static float f(22.222);
74 typedef std::tuple<int&, float&> tuple_type;
75 constexpr tuple_type p1 __attribute__((unused))
76 = std::tie(i, f);
77 }
78
79 {
80 static int i(22);
81 static float f(22.222);
82 static const int ii(77799);
83
84 typedef std::tuple<int&, float&, const int&> tuple_type;
85 constexpr tuple_type p1 __attribute__((unused))
86 = std::tie(i, f, ii);
87 }
88}
89
90// get
91void
92test_get()
93{
94 {
95 typedef std::tuple<int, float> tuple_type;
96 constexpr tuple_type t1 { 55, 77.77 };
97 constexpr auto var __attribute__((unused))
98 = std::get<1>(t1);
99 }
100
101 {
102 typedef std::tuple<int, float, int> tuple_type;
103 constexpr tuple_type t1 { 55, 77.77, 99 };
104 constexpr auto var __attribute__((unused))
105 = std::get<2>(t1);
106 }
107}
108
109// tuple_cat
110void
111test_tuple_cat()
112{
113 typedef std::tuple<int, float> tuple_type1;
114 typedef std::tuple<int, int, float> tuple_type2;
115
116 constexpr tuple_type1 t1 { 55, 77.77 };
117 constexpr tuple_type2 t2 { 55, 99, 77.77 };
118 constexpr auto cat1 __attribute__((unused)) = std::tuple_cat(t1, t2);
119}
120
121namespace {
122
123template<class T>
124constexpr int zero_from_anything(T)
125{
126 return 0;
127}
128
129}
130
131// ignore, see LWG 2773
132void
133test_ignore()
134{
135 constexpr auto ign1 __attribute__((unused)) = std::ignore;
136 constexpr auto ign2 __attribute__((unused)) = std::make_tuple(std::ignore);
137 constexpr int ign3 __attribute__((unused)) = zero_from_anything(std::ignore);
138}
139
140int
141main()
142{
143 test_make_tuple();
144 test_forward_as_tuple();
145 test_tie();
146 test_get();
147 test_tuple_cat();
148 test_ignore();
149
150 return 0;
151}