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