On Tue, 26 Nov 2024, Jason Merrill wrote: > Tested x86_64-pc-linux-gnu, OK for trunk? > > -- 8< -- > > Some tests were failing due to the exported using declaration of iter_move > conflicting with friend declarations; the exported using needs to be in the > inline namespace, like the customization point itself, rather than > std::ranges. > > Also add a few missing exports. > > Some tests failed to find some operators defined in implementation-detail > namespaces; this exports them as well, but as previously discussed it's > probably preferable to make those operators friends so ADL can find them > that way. > > libstdc++-v3/ChangeLog: > > * src/c++23/std.cc.in: Fix iter_move/swap. Add fold_left_first, to, > concat, and some operators. > --- > libstdc++-v3/src/c++23/std.cc.in | 64 ++++++++++++++++++-------------- > 1 file changed, 36 insertions(+), 28 deletions(-) > > diff --git a/libstdc++-v3/src/c++23/std.cc.in > b/libstdc++-v3/src/c++23/std.cc.in > index d225c8b8c85..7d787a55555 100644 > --- a/libstdc++-v3/src/c++23/std.cc.in > +++ b/libstdc++-v3/src/c++23/std.cc.in > @@ -494,8 +494,13 @@ export namespace std > #endif > #if __cpp_lib_ranges_fold > using ranges::fold_left; > + using ranges::fold_left_first; > + using ranges::fold_left_first_with_iter; > using ranges::fold_left_with_iter; > using ranges::fold_right; > + using ranges::fold_right_last; > + using ranges::in_value_result; > + using ranges::out_value_result; > #endif > #if __cpp_lib_ranges_find_last > using ranges::find_last; > @@ -1572,10 +1577,14 @@ export namespace std > using std::iter_reference_t; > using std::iter_value_t; > using std::iterator_traits; > - namespace ranges > + // _Cpo is an implementation detail we can't avoid exposing; if we do the > + // using in ranges directly, it conflicts with any friend functions of the > + // same name, which is why the customization points are in an inline > + // namespace in the first place. > + namespace ranges::inline _Cpo > { > - using std::ranges::iter_move; > - using std::ranges::iter_swap; > + using _Cpo::iter_move; > + using _Cpo::iter_swap; > } > using std::advance; > using std::bidirectional_iterator; > @@ -1679,6 +1688,15 @@ export namespace std > using std::make_const_sentinel; > #endif > } > +// FIXME these should be friends of __normal_iterator to avoid exporting > +// __gnu_cxx. > +export namespace __gnu_cxx > +{ > + using __gnu_cxx::operator==; > + using __gnu_cxx::operator<=>; > + using __gnu_cxx::operator+; > + using __gnu_cxx::operator-; > +} > > // <latch> > export namespace std > @@ -2278,43 +2296,32 @@ export namespace std > namespace views = ranges::views; > using std::tuple_element; > using std::tuple_size; > -#if __glibcxx_ranges_as_const // >= C++23 > namespace ranges > { > +#if __glibcxx_ranges_as_const // >= C++23 > using ranges::constant_range; > using ranges::const_iterator_t; > using ranges::const_sentinel_t; > using ranges::range_const_reference_t; > using ranges::as_const_view; > namespace views { using views::as_const; } > - } > #endif > #ifdef __glibcxx_generator // C++ >= 23 && __glibcxx_coroutine > - namespace ranges > - { > using ranges::elements_of; > - } > #endif > #ifdef __cpp_lib_ranges_as_rvalue // C++ >= 23 > - namespace ranges { > using ranges::as_rvalue_view; > namespace views { using views::as_rvalue; } > - } > #endif > #ifdef __cpp_lib_ranges_chunk // C++ >= 23 > - namespace ranges { > using ranges::chunk_view; > namespace views { using views::chunk; } > - } > #endif > #ifdef __cpp_lib_ranges_slide // C++ >= 23 > - namespace ranges { > using ranges::slide_view; > namespace views { using views::slide; } > - } > #endif > #ifdef __cpp_lib_ranges_zip // C++ >= 23 > - namespace ranges { > using ranges::zip_view; > using ranges::zip_transform_view; > using ranges::adjacent_view; > @@ -2327,44 +2334,45 @@ export namespace std > using views::pairwise; > using views::pairwise_transform; > } > - } > #endif > #ifdef __cpp_lib_ranges_chunk_by // C++ >= 23 > - namespace ranges { > using ranges::chunk_by_view; > namespace views { using views::chunk_by; } > - } > #endif > #ifdef __cpp_lib_ranges_join_with // C++ >= 23 > - namespace ranges { > using ranges::join_with_view; > namespace views { using views::join_with; } > - } > #endif > #ifdef __cpp_lib_ranges_repeat // C++ >= 23 > - namespace ranges { > using ranges::repeat_view; > namespace views { using views::repeat; } > - } > #endif > #ifdef __cpp_lib_ranges_stride // C++ >= 23 > - namespace ranges { > using ranges::stride_view; > namespace views { using views::stride; } > - } > #endif > #ifdef __cpp_lib_ranges_cartesian_product // C++ >= 23 > - namespace ranges { > using ranges::cartesian_product_view; > namespace views { using views::cartesian_product; } > - } > #endif > #ifdef __cpp_lib_ranges_enumerate // C++ >= 23 > - namespace ranges { > using ranges::enumerate_view; > namespace views { using views::enumerate; } > - } > #endif > +#if __cpp_lib_ranges_to_container // C++ >= 23 > + using ranges::to; > +#endif // __cpp_lib_ranges_to_container > +#if __cpp_lib_ranges_concat // C++ >= C++26 > + using ranges::concat_view; > + namespace views { using views::concat; } > +#endif > + > + // FIXME can we avoid this export using friends? > + namespace views::__adaptor > + { > + using __adaptor::operator|; > + }
FWIW these were defined as hidden friends of the (non-template) _RangeAdaptorClosure until r14-3293-g4a6f3676e7dd9e. _RangeAdaptorClosure to be a CRTP class template to avoid bloating range adaptor pipeline sizes (the common non-template base would inhibit no_unique_address when composing range adaptors). This caused problems with the hidden friend approach because each instantiation of the class would produce a logically distinct set of hidden friends which caused problems if ADL pulled in multiples of these hidden friends during overload resolution.. But I guess we can continue defining them at namespace scope and simply declare them as friends of _RangeAdaptorClosure for sake of ADL? I can submit a patch to that effect. > + } > } > > // <ratio> > > base-commit: 819f67a2f633d2000f09119f0e19b784ea0a4bd8 > -- > 2.47.0 > >