On Tue, 14 Jul 2026, 08:21 Jonathan Wakely, <[email protected]> wrote:
> > > On Tue, 14 Jul 2026, 08:15 Tomasz Kaminski, <[email protected]> wrote: > >> >> >> On Mon, Jul 13, 2026 at 7:15 PM Jonathan Wakely <[email protected]> >> wrote: >> >>> We should not try to export names which are not declared if GCC is >>> configured with --disable-wchar_t. >>> >>> We should also not define the wide stream aliases in <syncstream> and >>> <spanstream>. >>> >>> libstdc++-v3/ChangeLog: >>> >>> PR libstdc++/126111 >>> * include/std/format (__format::__write_escape_seq): Move alias >>> declaration into #ifdef _GLIBCXX_USE_WCHAR_T group. >>> * include/std/spanstream (wspanbuf, wispanstream, wospanstream) >>> (wspanstream): Only declare for _GLIBCXX_USE_WCHAR_T. >>> * include/std/syncstream (wsyncbuf wosyncstream): Likewise. >>> * src/c++23/std.cc.in: Add preprocessor checks for >>> _GLIBCXX_USE_WCHAR_T to names which depend on it. >>> --- >>> >>> Tested x86_64-linux. >>> >> Outside of single question below, this LGTM. >> >>> >>> libstdc++-v3/include/std/format | 2 +- >>> libstdc++-v3/include/std/spanstream | 8 ++++++ >>> libstdc++-v3/include/std/syncstream | 5 ++-- >>> libstdc++-v3/src/c++23/std.cc.in | 44 ++++++++++++++++++++++++----- >>> 4 files changed, 49 insertions(+), 10 deletions(-) >>> >>> diff --git a/libstdc++-v3/include/std/format >>> b/libstdc++-v3/include/std/format >>> index 1b4082e07a44..2530ecb58057 100644 >>> --- a/libstdc++-v3/include/std/format >>> +++ b/libstdc++-v3/include/std/format >>> @@ -1052,7 +1052,6 @@ namespace __format >>> __write_escape_seq(_Out __out, uint_least32_t __val, >>> basic_string_view<_CharT> __prefix) >>> { >>> - using _Str_view = basic_string_view<_CharT>; >>> >> Why do we need this change? The function should not be instantiated >> with _CharT = wchar_t, so this should be OK. >> > > Because it gives a -Wunused-local-typedef warning when the WCHAR_T macro > is undefined. > I'll change it to wstring_view. > > constexpr size_t __max = 8; >>> char __buf[__max]; >>> const string_view __narrow( >>> @@ -1067,6 +1066,7 @@ namespace __format >>> #ifdef _GLIBCXX_USE_WCHAR_T >>> else >>> { >>> + using _Str_view = basic_string_view<_CharT>; >>> >> If we go with this direction, simply replace _CharT with wchar_t >> in line below, and _Str_view with wstring_view in __format_write. >> >>> _CharT __wbuf[__max]; >>> const size_t __n = __narrow.size(); >>> std::__to_wstring_numeric(__narrow.data(), __n, __wbuf); >>> diff --git a/libstdc++-v3/include/std/spanstream >>> b/libstdc++-v3/include/std/spanstream >>> index fd2a446ddaa3..6f1f681ae793 100644 >>> --- a/libstdc++-v3/include/std/spanstream >>> +++ b/libstdc++-v3/include/std/spanstream >>> @@ -225,7 +225,9 @@ template<typename _CharT, typename _Traits> >>> { __x.swap(__y); } >>> >>> using spanbuf = basic_spanbuf<char>; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using wspanbuf = basic_spanbuf<wchar_t>; >>> +#endif >>> >>> template<typename _CharT, typename _Traits> >>> class basic_ispanstream >>> @@ -319,7 +321,9 @@ template<typename _CharT, typename _Traits> >>> { __x.swap(__y); } >>> >>> using ispanstream = basic_ispanstream<char>; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using wispanstream = basic_ispanstream<wchar_t>; >>> +#endif >>> >>> template<typename _CharT, typename _Traits> >>> class basic_ospanstream >>> @@ -389,7 +393,9 @@ template<typename _CharT, typename _Traits> >>> { __x.swap(__y); } >>> >>> using ospanstream = basic_ospanstream<char>; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using wospanstream = basic_ospanstream<wchar_t>; >>> +#endif >>> >>> template<typename _CharT, typename _Traits> >>> class basic_spanstream >>> @@ -459,7 +465,9 @@ template<typename _CharT, typename _Traits> >>> { __x.swap(__y); } >>> >>> using spanstream = basic_spanstream<char>; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using wspanstream = basic_spanstream<wchar_t>; >>> +#endif >>> >>> _GLIBCXX_END_NAMESPACE_VERSION >>> } // namespace std >>> diff --git a/libstdc++-v3/include/std/syncstream >>> b/libstdc++-v3/include/std/syncstream >>> index 9cecd513e9a5..7a1f956dca55 100644 >>> --- a/libstdc++-v3/include/std/syncstream >>> +++ b/libstdc++-v3/include/std/syncstream >>> @@ -299,10 +299,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION >>> { __x.swap(__y); } >>> >>> using syncbuf = basic_syncbuf<char>; >>> - using wsyncbuf = basic_syncbuf<wchar_t>; >>> - >>> using osyncstream = basic_osyncstream<char>; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> + using wsyncbuf = basic_syncbuf<wchar_t>; >>> using wosyncstream = basic_osyncstream<wchar_t>; >>> +#endif >>> _GLIBCXX_END_NAMESPACE_VERSION >>> } // namespace std >>> #endif // __cpp_lib_syncbuf >>> diff --git a/libstdc++-v3/src/c++23/std.cc.in b/libstdc++-v3/src/c++23/ >>> std.cc.in >>> index dbed0112dca5..5aab08f2c498 100644 >>> --- a/libstdc++-v3/src/c++23/std.cc.in >>> +++ b/libstdc++-v3/src/c++23/std.cc.in >>> @@ -1368,17 +1368,19 @@ export namespace std >>> #endif >>> using std::formatter; >>> using std::make_format_args; >>> - using std::make_wformat_args; >>> #if __cpp_lib_format >= 202603L // >= C++26 >>> using std::dynamic_format; >>> #endif >>> using std::vformat; >>> using std::vformat_to; >>> using std::visit_format_arg; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> + using std::make_wformat_args; >>> using std::wformat_args; >>> using std::wformat_context; >>> using std::wformat_parse_context; >>> using std::wformat_string; >>> +#endif >>> #ifdef __cpp_lib_format_ranges >>> using std::format_kind; >>> using std::range_format; >>> @@ -1416,10 +1418,12 @@ export namespace std >>> using std::ifstream; >>> using std::ofstream; >>> using std::swap; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::wfilebuf; >>> using std::wfstream; >>> using std::wifstream; >>> using std::wofstream; >>> +#endif >>> } >>> >>> // <functional> >>> @@ -1620,7 +1624,9 @@ export namespace std >>> using std::streamsize; >>> using std::unitbuf; >>> using std::uppercase; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::wios; >>> +#endif >>> } >>> >>> // <iosfwd> >>> @@ -1639,9 +1645,11 @@ export namespace std >>> using std::basic_syncbuf; >>> using std::osyncstream; >>> using std::syncbuf; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::wosyncstream; >>> using std::wsyncbuf; >>> #endif >>> +#endif >>> } >>> >>> // <iostream> >>> @@ -1651,10 +1659,12 @@ export namespace std >>> using std::cin; >>> using std::clog; >>> using std::cout; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::wcerr; >>> using std::wcin; >>> using std::wclog; >>> using std::wcout; >>> +#endif >>> } >>> >>> // <istream> >>> @@ -1664,8 +1674,10 @@ export namespace std >>> using std::basic_istream; >>> using std::iostream; >>> using std::istream; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::wiostream; >>> using std::wistream; >>> +#endif >>> using std::ws; >>> using std::operator>>; >>> } >>> @@ -2487,7 +2499,9 @@ export namespace std >>> using std::ends; >>> using std::flush; >>> using std::ostream; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::wostream; >>> +#endif >>> using std::operator<<; >>> #ifdef __cpp_lib_syncbuf >>> using std::emit_on_flush; >>> @@ -2916,9 +2930,11 @@ export namespace std >>> using std::ssub_match; >>> using std::sub_match; >>> using std::swap; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::wcsub_match; >>> using std::wregex; >>> using std::wssub_match; >>> +#endif >>> using std::operator==; >>> using std::operator<=>; >>> using std::operator<<; >>> @@ -2934,20 +2950,24 @@ export namespace std >>> using std::smatch; >>> using std::sregex_iterator; >>> using std::sregex_token_iterator; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::wcmatch; >>> using std::wcregex_iterator; >>> using std::wcregex_token_iterator; >>> using std::wsmatch; >>> using std::wsregex_iterator; >>> using std::wsregex_token_iterator; >>> +#endif >>> namespace pmr >>> { >>> #if _GLIBCXX_USE_CXX11_ABI >>> using std::pmr::cmatch; >>> using std::pmr::match_results; >>> using std::pmr::smatch; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::pmr::wcmatch; >>> using std::pmr::wsmatch; >>> +#endif >>> #endif >>> } >>> } >>> @@ -3020,17 +3040,19 @@ export namespace std >>> export namespace std >>> { >>> using std::basic_spanbuf; >>> - using std::spanbuf; >>> - using std::wspanbuf; >>> using std::basic_ispanstream; >>> - using std::ispanstream; >>> - using std::wispanstream; >>> using std::basic_ospanstream; >>> - using std::ospanstream; >>> - using std::wospanstream; >>> using std::basic_spanstream; >>> + using std::spanbuf; >>> + using std::ispanstream; >>> + using std::ospanstream; >>> using std::spanstream; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> + using std::wspanbuf; >>> + using std::wispanstream; >>> + using std::wospanstream; >>> using std::wspanstream; >>> +#endif >>> } >>> #endif >>> >>> @@ -3046,10 +3068,12 @@ export namespace std >>> using std::stringbuf; >>> using std::stringstream; >>> using std::swap; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::wistringstream; >>> using std::wostringstream; >>> using std::wstringbuf; >>> using std::wstringstream; >>> +#endif >>> } >>> >>> // <stack> >>> @@ -3144,7 +3168,9 @@ export namespace std >>> { >>> using std::basic_streambuf; >>> using std::streambuf; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::wstreambuf; >>> +#endif >>> } >>> >>> // <string> >>> @@ -3171,7 +3197,9 @@ export namespace std >>> using std::stoull; >>> using std::string; >>> using std::to_string; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::to_wstring; >>> +#endif >>> using std::u16string; >>> using std::u32string; >>> using std::u8string; >>> @@ -3236,9 +3264,11 @@ export namespace std >>> using std::basic_osyncstream; >>> using std::osyncstream; >>> using std::syncbuf; >>> +#ifdef _GLIBCXX_USE_WCHAR_T >>> using std::wosyncstream; >>> using std::wsyncbuf; >>> #endif >>> +#endif >>> } >>> >>> // 19.5 <system_error> >>> -- >>> 2.55.0 >>> >>>
