[PATCH] libstdc++: Fix std module to work with --disable-wchar_t [PR126111]
Jonathan Wakely
jwakely.gcc@gmail.com
Tue Jul 21 09:02:42 GMT 2026
On Tue, 21 Jul 2026, 05:53 Tomasz Kaminski, <tkaminsk@redhat.com> wrote:
>
>
> On Tue, Jul 14, 2026 at 9:22 AM Jonathan Wakely <jwakely.gcc@gmail.com>
> wrote:
>
>>
>>
>> On Tue, 14 Jul 2026, 08:21 Jonathan Wakely, <jwakely.gcc@gmail.com>
>> wrote:
>>
>>>
>>>
>>> On Tue, 14 Jul 2026, 08:15 Tomasz Kaminski, <tkaminsk@redhat.com> wrote:
>>>
>>>>
>>>>
>>>> On Mon, Jul 13, 2026 at 7:15 PM Jonathan Wakely <jwakely@redhat.com>
>>>> 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?
>
I already backported it to 15 and 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
>>>>>
>>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20260721/a8125616/attachment-0001.htm>
More information about the Libstdc++
mailing list