On Mon, 4 Aug 2025, Jakub Jelinek wrote: > On Mon, Aug 04, 2025 at 12:00:32PM +0200, Jonathan Wakely wrote: > > using std::operator""d; > > using std::operator""h; > > using std::operator""min; > > using std::operator""ms; > > using std::operator""ns; > > using std::operator""sv; > > using std::operator""us; > > using std::operator""y; > > > > Shouldn't these be in std::chrono? Or the inline namespace chrono_literals > > Yeah, guess the plugin should be modified to silently look through inline > namespaces only when they have names starting with underscore (e.g. __cxx11) > but not when they have non-uglified names (e.g. the > std::literals::chrono_literals:: cases). > > > using std::ranges::iter_move; > > using std::ranges::iter_swap; > > > > These should be exported - I'm surprised we're missing them. > > > > using std::regex_constants::awk; > > > > All these constants should be exported. > > > > I think all the other names have been removed from the standard and are not > > in C++20. > > I went through it all now, using cppreference as a quick check for stuff > removed in C++17/C++20 and for everything added verified it is in > corresponding eel.is/c++-draft/*.syn etc. and looked it up in the libstdc++ > headers for guarding macros. > > After all the additions I've compiled std.cc with -std=c++20, -std=c++23 and > -std=c++26, the first one revealed std::ranges::shift_{left,right} emitted an > error in that case, the patch fixes that too. > > Ok for trunk? > > 2025-08-04 Jakub Jelinek <ja...@redhat.com> > > PR libstdc++/121373 > * src/c++23/std.cc.in (std::ranges::shift_left, > std::ranges::shift_right): Only export for C++23 and later. > (std::ranges::fold_left_first_with_iter_result, > std::ranges::fold_left_with_iter_result): Export. > (std::byteswap): Export for C++23 and later. > (std::ranges::iter_move, std::ranges::iter_swap): Export. > (std::projected_value_t): Export for C++26 and later. > (std::out_ptr_t, std::inout_ptr_t): Export. > (std::ranges::iota_result): Export. > (std::regex_constants): Export a lot of constants. > (std::is_scoped_enum, std::is_scoped_enum_v): Export. > > --- libstdc++-v3/src/c++23/std.cc.in.jj 2025-08-02 20:50:48.301748803 > +0200 > +++ libstdc++-v3/src/c++23/std.cc.in 2025-08-04 12:13:30.778385590 +0200 > @@ -277,15 +277,14 @@ export namespace std > using std::ranges::shuffle; > } > using std::shift_left; > - namespace ranges > - { > - using std::ranges::shift_left; > - } > using std::shift_right; > +#if __cpp_lib_shift >= 202202L // >= C++23 > namespace ranges > { > + using std::ranges::shift_left; > using std::ranges::shift_right; > } > +#endif > using std::sort; > namespace ranges > { > @@ -500,7 +499,9 @@ export namespace std > using ranges::fold_left; > using ranges::fold_left_first; > using ranges::fold_left_first_with_iter; > + using ranges::fold_left_first_with_iter_result; > using ranges::fold_left_with_iter; > + using ranges::fold_left_with_iter_result; > using ranges::fold_right; > using ranges::fold_right_last; > using ranges::in_value_result; > @@ -672,6 +673,9 @@ export namespace std > using std::popcount; > using std::rotl; > using std::rotr; > +#if __cpp_lib_byteswap // >= C++23 > + using std::byteswap; > +#endif > } > > // 22.9 <bitset> > @@ -1693,6 +1697,8 @@ export namespace std > { > using std::ranges::advance; > using std::ranges::distance; > + using std::ranges::iter_move; > + using std::ranges::iter_swap;
Actually a few lines above we already do: // _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 _Cpo::iter_move; using _Cpo::iter_swap; } So I think we don't want to export iter_move and iter_swap directly... Sorry for not catching this sooner :/ > using std::ranges::next; > using std::ranges::prev; > } > @@ -1747,6 +1753,9 @@ export namespace std > using std::make_const_iterator; > using std::make_const_sentinel; > #endif > +#if __glibcxx_algorithm_default_value_type // >= C++26 > + using std::projected_value_t; > +#endif > } > > // <latch> > @@ -1973,6 +1982,8 @@ export namespace std > #if __cpp_lib_out_ptr > using std::out_ptr; > using std::inout_ptr; > + using std::out_ptr_t; > + using std::inout_ptr_t; > #endif > #if __cpp_lib_indirect > using std::indirect; > @@ -2101,7 +2112,11 @@ export namespace std > using std::lcm; > using std::midpoint; > #if __cpp_lib_ranges_iota > - namespace ranges { using ranges::iota; } > + namespace ranges > + { > + using ranges::iota; > + using ranges::iota_result; > + } > #endif > #if __cpp_lib_saturation_arithmetic > using std::add_sat; > @@ -2512,6 +2527,43 @@ export namespace std > using std::regex_constants::operator|; > using std::regex_constants::operator|=; > using std::regex_constants::operator~; > + using std::regex_constants::awk; > + using std::regex_constants::basic; > + using std::regex_constants::collate; > + using std::regex_constants::ECMAScript; > + using std::regex_constants::egrep; > + using std::regex_constants::extended; > + using std::regex_constants::grep; > + using std::regex_constants::icase; > + using std::regex_constants::multiline; > + using std::regex_constants::nosubs; > + using std::regex_constants::optimize; > + using std::regex_constants::format_default; > + using std::regex_constants::format_first_only; > + using std::regex_constants::format_no_copy; > + using std::regex_constants::format_sed; > + using std::regex_constants::match_any; > + using std::regex_constants::match_continuous; > + using std::regex_constants::match_default; > + using std::regex_constants::match_not_bol; > + using std::regex_constants::match_not_bow; > + using std::regex_constants::match_not_eol; > + using std::regex_constants::match_not_eow; > + using std::regex_constants::match_not_null; > + using std::regex_constants::match_prev_avail; > + using std::regex_constants::error_backref; > + using std::regex_constants::error_badbrace; > + using std::regex_constants::error_badrepeat; > + using std::regex_constants::error_brace; > + using std::regex_constants::error_brack; > + using std::regex_constants::error_collate; > + using std::regex_constants::error_complexity; > + using std::regex_constants::error_ctype; > + using std::regex_constants::error_escape; > + using std::regex_constants::error_paren; > + using std::regex_constants::error_range; > + using std::regex_constants::error_space; > + using std::regex_constants::error_stack; > } > using std::basic_regex; > using std::csub_match; > @@ -3153,6 +3205,10 @@ export namespace std > using std::is_pointer_interconvertible_base_of_v; > using std::is_pointer_interconvertible_with_class; > #endif > +#if __cpp_lib_is_scoped_enum > + using std::is_scoped_enum; > + using std::is_scoped_enum_v; > +#endif > } > > // <typeindex> > > > Jakub > >