2121#include < vector>
2222
2323#include " test_iterators.h"
24+ #include " ../types.h"
2425
2526template <class View , class Pattern >
2627concept CanFormJoinWithView = requires { typename std::ranges::join_with_view<View, Pattern>; };
@@ -133,7 +134,7 @@ static_assert(!CanFormJoinWithView<View, Pattern>);
133134
134135// join_with_view is not valid when `range_reference_t<View>` and pattern
135136// does not model together compatible-joinable-ranges
136- namespace test_when_used_ranges_are_not_compatible_joinable_ranges {
137+ namespace test_when_used_ranges_are_not_concatable {
137138using std::ranges::range_reference_t ;
138139using std::ranges::range_rvalue_reference_t ;
139140using std::ranges::range_value_t ;
@@ -144,15 +145,15 @@ struct View : std::ranges::view_base {
144145 InnerRange* end ();
145146};
146147
147- namespace no_common_range_value_type {
148+ namespace no_concat_reference_t {
149+ struct ValueType {};
150+
148151struct InnerRange {
149152 struct It {
150- using difference_type = ptrdiff_t ;
151- struct value_type {};
152-
153+ using difference_type = std::ptrdiff_t ;
154+ using value_type = ValueType;
153155 struct reference {
154156 operator value_type ();
155- operator float ();
156157 };
157158
158159 It& operator ++();
@@ -165,28 +166,42 @@ struct InnerRange {
165166};
166167
167168struct Pattern : std::ranges::view_base {
168- const float * begin ();
169- const float * end ();
169+ struct It {
170+ using difference_type = std::ptrdiff_t ;
171+ using value_type = ValueType;
172+ struct reference {
173+ operator value_type ();
174+ };
175+
176+ It& operator ++();
177+ It operator ++(int );
178+ reference operator *() const ;
179+ bool operator ==(const It&) const ;
180+ friend value_type&& iter_move(const It&);
181+ };
182+
183+ It begin ();
184+ It end ();
170185};
171186
172187static_assert (std::ranges::input_range<InnerRange>);
173188static_assert (std::ranges::forward_range<Pattern>);
174189static_assert (std::ranges::view<Pattern>);
175- static_assert (!std::common_with< range_value_t <InnerRange>, range_value_t <Pattern>>);
176- static_assert (std::common_reference_with< range_reference_t <InnerRange>, range_reference_t <Pattern>>);
190+ static_assert (!std::common_reference_with< range_reference_t <InnerRange>, range_reference_t <Pattern>>);
191+ static_assert (std::common_with< range_value_t <InnerRange>, range_value_t <Pattern>>);
177192static_assert (std::common_reference_with<range_rvalue_reference_t <InnerRange>, range_rvalue_reference_t <Pattern>>);
178193static_assert (!CanFormJoinWithView<View<InnerRange>, Pattern>);
179- } // namespace no_common_range_value_type
180-
181- namespace no_common_range_reference_type {
182- struct ValueType {};
194+ } // namespace no_concat_reference_t
183195
196+ namespace no_concat_value_t {
184197struct InnerRange {
185198 struct It {
186- using difference_type = ptrdiff_t ;
187- using value_type = ValueType;
199+ using difference_type = std::ptrdiff_t ;
200+ struct value_type {};
201+
188202 struct reference {
189203 operator value_type ();
204+ operator float ();
190205 };
191206
192207 It& operator ++();
@@ -199,34 +214,20 @@ struct InnerRange {
199214};
200215
201216struct Pattern : std::ranges::view_base {
202- struct It {
203- using difference_type = ptrdiff_t ;
204- using value_type = ValueType;
205- struct reference {
206- operator value_type ();
207- };
208-
209- It& operator ++();
210- It operator ++(int );
211- reference operator *() const ;
212- bool operator ==(const It&) const ;
213- friend value_type&& iter_move(const It&);
214- };
215-
216- It begin ();
217- It end ();
217+ const float * begin ();
218+ const float * end ();
218219};
219220
220221static_assert (std::ranges::input_range<InnerRange>);
221222static_assert (std::ranges::forward_range<Pattern>);
222223static_assert (std::ranges::view<Pattern>);
223- static_assert (std::common_with< range_value_t <InnerRange>, range_value_t <Pattern>>);
224- static_assert (!std::common_reference_with< range_reference_t <InnerRange>, range_reference_t <Pattern>>);
224+ static_assert (std::common_reference_with< range_reference_t <InnerRange>, range_reference_t <Pattern>>);
225+ static_assert (!std::common_with< range_value_t <InnerRange>, range_value_t <Pattern>>);
225226static_assert (std::common_reference_with<range_rvalue_reference_t <InnerRange>, range_rvalue_reference_t <Pattern>>);
226227static_assert (!CanFormJoinWithView<View<InnerRange>, Pattern>);
227- } // namespace no_common_range_reference_type
228+ } // namespace no_concat_value_t
228229
229- namespace no_common_range_rvalue_reference_type {
230+ namespace no_concat_rvalue_reference_t {
230231struct InnerRange {
231232 using It = cpp20_input_iterator<int *>;
232233 It begin ();
@@ -235,7 +236,7 @@ struct InnerRange {
235236
236237struct Pattern : std::ranges::view_base {
237238 struct It {
238- using difference_type = ptrdiff_t ;
239+ using difference_type = std:: ptrdiff_t ;
239240 struct value_type {
240241 operator int () const ;
241242 };
@@ -258,9 +259,31 @@ struct Pattern : std::ranges::view_base {
258259static_assert (std::ranges::input_range<InnerRange>);
259260static_assert (std::ranges::forward_range<Pattern>);
260261static_assert (std::ranges::view<Pattern>);
261- static_assert (std::common_with<range_value_t <InnerRange>, range_value_t <Pattern>>);
262262static_assert (std::common_reference_with<range_reference_t <InnerRange>, range_reference_t <Pattern>>);
263+ static_assert (std::common_with<range_value_t <InnerRange>, range_value_t <Pattern>>);
263264static_assert (!std::common_reference_with<range_rvalue_reference_t <InnerRange>, range_rvalue_reference_t <Pattern>>);
264265static_assert (!CanFormJoinWithView<View<InnerRange>, Pattern>);
265- } // namespace no_common_range_rvalue_reference_type
266- } // namespace test_when_used_ranges_are_not_compatible_joinable_ranges
266+ } // namespace no_concat_rvalue_reference_t
267+
268+ namespace not_concat_indirectly_readable { // Required after LWG-4074 ("compatible-joinable-ranges is underconstrained")
269+ struct InnerRange {
270+ using It = cpp20_input_iterator<int *>;
271+ It begin ();
272+ sentinel_wrapper<It> end ();
273+ };
274+
275+ struct Pattern : std::ranges::view_base {
276+ lwg4074::Iter begin ();
277+ lwg4074::Iter end ();
278+ };
279+
280+ static_assert (std::ranges::input_range<InnerRange>);
281+ static_assert (std::ranges::forward_range<Pattern>);
282+ static_assert (std::ranges::view<Pattern>);
283+ static_assert (std::common_reference_with<range_reference_t <InnerRange>, range_reference_t <Pattern>>);
284+ static_assert (std::common_with<range_value_t <InnerRange>, range_value_t <Pattern>>);
285+ static_assert (std::common_reference_with<range_rvalue_reference_t <InnerRange>, range_rvalue_reference_t <Pattern>>);
286+ LIBCPP_STATIC_ASSERT (!std::ranges::__concat_indirectly_readable<InnerRange, Pattern>);
287+ static_assert (!CanFormJoinWithView<View<InnerRange>, Pattern>);
288+ } // namespace not_concat_indirectly_readable
289+ } // namespace test_when_used_ranges_are_not_concatable
0 commit comments