On Tue, Jul 14, 2026 at 9:22 AM Jonathan Wakely <[email protected]> wrote:
> > > 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. >>> >> Should we backport this to GCC-16? > >>>> 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 >>>> >>>>
