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|; + } + } } // <ratio> base-commit: 819f67a2f633d2000f09119f0e19b784ea0a4bd8 -- 2.47.0