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. 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 >> >>
