]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/std/ranges/p2325.cc
libstdc++: Disable hosted-only tests [PR103626]
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / std / ranges / p2325.cc
1 // { dg-options "-std=gnu++20" }
2 // { dg-do compile { target c++20 } }
3 // { dg-require-effective-target hosted }
4 // P2325R3 "Views should not be required to be default constructible"
5
6 #include <ranges>
7 #include <iterator>
8 #include <span>
9 #include <sstream>
10 #include <vector>
11 #include <testsuite_iterators.h>
12
13 using namespace std;
14
15 template<default_initializable T> void f();
16 template<typename T> requires weakly_incrementable<T> || ranges::view<T> void f();
17
18 void
19 test01()
20 {
21 // Verify neither std::weakly_incrementable nor ranges::view require
22 // default_initializable.
23 f<int>(); // { dg-error "ambiguous" }
24 }
25
26 void
27 test02()
28 {
29 // Verify these iterators are not default constructible.
30 static_assert(!default_initializable<insert_iterator<vector<int>>>);
31 static_assert(!default_initializable<front_insert_iterator<vector<int>>>);
32 static_assert(!default_initializable<back_insert_iterator<vector<int>>>);
33 static_assert(!default_initializable<ostream_iterator<int>>);
34
35 using iter = ostream_iterator<int>;
36
37 // Verify common_iterator is conditionally default constructible.
38 static_assert(!default_initializable<common_iterator<iter, unreachable_sentinel_t>>);
39 static_assert(default_initializable<common_iterator<int*, unreachable_sentinel_t>>);
40
41 // Verify counted_iterator is conditionally default constructible.
42 static_assert(!default_initializable<counted_iterator<iter>>);
43 static_assert(default_initializable<counted_iterator<int*>>);
44 }
45
46 void
47 test03()
48 {
49 using iter = ostream_iterator<int>;
50
51 // Verify iota_view is conditionally default constructible.
52 static_assert(!default_initializable<ranges::iota_view<iter>>);
53 static_assert(!default_initializable<decltype(declval<ranges::iota_view<iter>>().begin())>);
54 static_assert(default_initializable<ranges::iota_view<int>>);
55 static_assert(default_initializable<decltype(declval<ranges::iota_view<int>>().begin())>);
56
57 // Verify subrange is conditionally default constructible.
58 static_assert(!default_initializable<ranges::subrange<iter, unreachable_sentinel_t>>);
59 static_assert(default_initializable<ranges::subrange<int*, unreachable_sentinel_t>>);
60
61 // Verify single_view is conditionally default constructible.
62 static_assert(!default_initializable<ranges::single_view<iter>>);
63 static_assert(default_initializable<ranges::single_view<int*>>);
64 }
65
66 void
67 test04()
68 {
69 // Verify basic_istream_view is not default constructible.
70 using type = ranges::basic_istream_view<int, char, char_traits<char>>;
71 static_assert(!default_initializable<type>);
72 static_assert(!default_initializable<decltype(declval<type>().begin())>);
73 }
74
75 void
76 test05()
77 {
78 // Verify ref_view is not default constructible.
79 static_assert(!default_initializable<ranges::ref_view<int[5]>>);
80 }
81
82 template<auto adaptor>
83 void
84 test06()
85 {
86 auto f1 = [] (auto) { return true; };
87 auto f2 = [i=0] (auto) { return true; };
88 static_assert(default_initializable<decltype(views::single(0) | adaptor(f1))>);
89 static_assert(!default_initializable<decltype(views::single(0) | adaptor(f2))>);
90
91 struct S { S() = delete; };
92 static_assert(!default_initializable<decltype(views::single(declval<S>()) | adaptor(f1))>);
93 static_assert(!default_initializable<decltype(views::single(declval<S>()) | adaptor(f2))>);
94 }
95
96 // Verify filter_view, transform_view, take_while_view and drop_while_view are
97 // conditionally default constructible.
98 template void test06<views::filter>();
99 template void test06<views::transform>();
100 template void test06<views::take_while>();
101 template void test06<views::drop_while>();
102
103 void
104 test07()
105 {
106 // Verify join_view is conditionally default constructible.
107 struct S { S() = delete; };
108 using type1 = ranges::join_view<ranges::single_view<ranges::single_view<S>>>;
109 static_assert(!default_initializable<type1>);
110 using type2 = ranges::join_view<ranges::single_view<ranges::single_view<int>>>;
111 static_assert(default_initializable<type2>);
112 }
113
114 void
115 test08()
116 {
117 // Verify lazy_split_view is conditionally default constructible.
118 using type1 = ranges::lazy_split_view<ranges::ref_view<int[2]>, ranges::single_view<int>>;
119 static_assert(!default_initializable<type1>);
120 using type2 = ranges::lazy_split_view<ranges::single_view<int>, ranges::ref_view<int[2]>>;
121 static_assert(!default_initializable<type2>);
122 using type3 = ranges::lazy_split_view<ranges::ref_view<int[2]>, ranges::ref_view<int[2]>>;
123 static_assert(!default_initializable<type3>);
124 using type4 = ranges::lazy_split_view<ranges::single_view<int>, ranges::single_view<int>>;
125 static_assert(default_initializable<type4>);
126 }
127
128 void
129 test08a()
130 {
131 // Verify split_view is conditionally default constructible.
132 using type1 = ranges::split_view<ranges::ref_view<int[2]>, ranges::single_view<int>>;
133 static_assert(!default_initializable<type1>);
134 using type2 = ranges::split_view<ranges::single_view<int>, ranges::ref_view<int[2]>>;
135 static_assert(!default_initializable<type2>);
136 using type3 = ranges::split_view<ranges::ref_view<int[2]>, ranges::ref_view<int[2]>>;
137 static_assert(!default_initializable<type3>);
138 using type4 = ranges::split_view<ranges::single_view<int>, ranges::single_view<int>>;
139 static_assert(default_initializable<type4>);
140 }
141
142 void
143 test09()
144 {
145 // Verify common_view is conditionally default constructible.
146 using type1 = ranges::common_view<ranges::iota_view<ostream_iterator<int>>>;
147 static_assert(!default_initializable<type1>);
148 using type2 = ranges::common_view<ranges::iota_view<int*>>;
149 static_assert(default_initializable<type2>);
150 }
151
152 void
153 test10()
154 {
155 // Verify reverse_view is conditionally default constructible.
156 using type1 = ranges::reverse_view<ranges::ref_view<int[2]>>;
157 static_assert(!default_initializable<type1>);
158 using type2 = ranges::reverse_view<ranges::single_view<int>>;
159 static_assert(default_initializable<type2>);
160 }
161
162 void
163 test11()
164 {
165 // Verify elements_view is conditionally default constructible.
166 using type1 = ranges::elements_view<ranges::ref_view<pair<int,int>[2]>, 0>;
167 static_assert(!default_initializable<type1>);
168 using type2 = ranges::elements_view<ranges::single_view<pair<int,int>>, 0>;
169 static_assert(default_initializable<type2>);
170 }