[PATCH][_GLIBCXX_DEBUG] _Safe_iterator_base/_Safe_sequence_base code cleanup

François Dumont frs.dumont@gmail.com
Wed Oct 7 04:54:05 GMT 2026


Committed, using '= 0' to initialize pointers.

On 10/5/26 19:43, Jonathan Wakely wrote:
> OK for trunk with a change to the commit log to mention it's using
> C++11 extensions.
>
> On Mon, 5 Oct 2026 at 18:42, Jonathan Wakely <jwakely@redhat.com> wrote:
>> On Mon, 5 Oct 2026 at 18:34, François Dumont <frs.dumont@gmail.com> wrote:
>>> Much better indeed.
>>>
>>> Disabling C++11 extensions warning does not give access to 'nullptr'
>>> keyword so I used value-initialization, I hope it is fine.
>> We generally just use '= 0' to initialize pointers in C++98 code.
>>
>>> Maybe I should also use only 1 block of #pragma GCC diagnostic push/pop
>>> so enclosing almost all header content within it ?
>> If there were many uses of it then I'd say yes, but there are only two
>> such blocks so this is OK.
>>
>>
>>>       libstdc++: [_GLIBCXX_DEBUG] _Safe_iterator_base/_Safe_sequence_base
>>> code cleanup
>>>
>>>       Use default member-initializer for both _Safe_iterator_base and
>>>       _Safe_sequence_base and so default their default constructor.
>>>
>>>       Have _Safe_sequence_base copy constructor always defined,
>>> forwarding to the default constructor.
>>>
>>>       Use value-initialization syntax when setting pointers to nullptr
>>> instead of
>>>       using '= 0'.
>> The commit log should mention that it's using C++11 features but
>> disabling the warnings with pragmas.
>>
>>
>>>       libstdc++-v3/ChangeLog:
>>>
>>>               * include/debug/safe_base.h
>>>               (_Safe_iterator_base::_M_sequence): Add default
>>> member-initializer.
>>>               (_Safe_iterator_base::_M_version): Likewise.
>>>               (_Safe_iterator_base::_M_prior): Likewise.
>>>               (_Safe_iterator_base::_M_next): Likewise.
>>>               (_Safe_iterator_base()): Default implementation.
>>>               (_Safe_iterator_base(const _Safe_sequence_base*, bool)):
>>> Forward to default
>>>               constructor.
>>>               (_Safe_iterator_base(const _Safe_iterator_base&, bool)):
>>> Likewise.
>>>               (_Safe_sequence_base::_M_iterators): Add default
>>> member-initializer.
>>>               (_Safe_sequence_base::_M_const_iterators): Likewise.
>>>               (_Safe_sequence_base::_M_version): Likewise.
>>>               (_Safe_sequence_base()): Default implementation.
>>>               (_Safe_sequence_base(const _Safe_sequence_base&)): Forward
>>> to default
>>>               constructor.
>>>
>>> Tested under Linux x86_64 _GLIBCXX_DEBUG mode C++98/C++20.
>>>
>>> Ok to commit ?
>>>
>>> François
>>>
>>> On 10/2/26 00:14, Jonathan Wakely wrote:
>>>> On Thu, 1 Oct 2026 at 18:36, Jonathan Wakely <jwakely@redhat.com> wrote:
>>>>> On Thu, 1 Oct 2026 at 18:29, François Dumont <frs.dumont@gmail.com> wrote:
>>>>>> I'd like to commit this code cleanup. It is not fixing anything except
>>>>>> perhaps for some code analysis tools reporting minor issues.
>>>>> Does this really clean things up? Now there are two definitions for
>>>>> most of those constructors.
>>>>>
>>>>> Maybe it's possible to just use the >= 201103 versions
>>>>> unconditionally, and disable -Wc++11-extensions warnings?
>>>> Yes, both GCC and Clang compile this without warnings using -std=c++98
>>>>
>>>> #pragma GCC diagnostic push
>>>> #pragma GCC diagnostic ignored "-Wc++11-extensions"
>>>> template<class T>
>>>> struct S
>>>> {
>>>>     S() = default;
>>>>     S(const S&) = default;
>>>>
>>>>     T i = 0;
>>>> };
>>>> #pragma GCC diagnostic pop
>>>>
>>>> int main()
>>>> {
>>>>     S<int> s;
>>>> }
>>>>
>>>> So you can add those pragmas and then *really* clean up the code, by
>>>> only keeping the versions with the defaulted constructors and the
>>>> default member-initializers.
>>>>
>>>>
>>>>
>>>>>> Despite being trivial and limited to _GLIBCCX_DEBUG I'd like to have
>>>>>> some feedback at least on the ChangeLog, to make sure I've used the
>>>>>> right C++ words.
>>>>>>
>>>>>>        libstdc++: [_GLIBCXX_DEBUG] _Safe_iterator_base/_Safe_sequence_base
>>>>>> code cleanup
>>>>>>
>>>>>>        Use inlined initialization for both _Safe_iterator_base and
>>>>>>        _Safe_sequence_base and so default their default constructor.
>>>>>>
>>>>>>        Have _Safe_sequence_base copy constructor always defined, using same
>>>>>>        implementation as the default constructor.
>>>>>>
>>>>>>        Use value-initialization syntax when setting pointers to nullptr
>>>>>> before C++11
>>>>>>        instead of using 0.
>>>>>>
>>>>>>        libstdc++-v3/ChangeLog:
>>>>>>
>>>>>>                * include/debug/safe_base.h
>>>>>>                [__cplusplus >= 201103L]
>>>>>>                (_Safe_iterator_base::_M_sequence): Add inline initialization.
>>>>> You've added a default member-initializer
>>>>>
>>>>>>                (_Safe_iterator_base::_M_version): Likewise.
>>>>>>                (_Safe_iterator_base::_M_prior): Likewise.
>>>>>>                (_Safe_iterator_base::_M_next): Likewise.
>>>>>>                [__cplusplus < 201103L](_Safe_iterator_base()): Value
>>>>>> initialize members.
>>>>>>                [__cplusplus >= 201103L](_Safe_iterator_base()): Default
>>>>>> implementation.
>>>>>>                (_Safe_iterator_base(const _Safe_sequence_base*, bool)):
>>>>>> Value initialize members.
>>>>>>                (_Safe_iterator_base(const _Safe_iterator_base&, bool)):
>>>>>> Likewise.
>>>>>>                [__cplusplus >= 201103L]
>>>>>>                (_Safe_sequence_base::_M_iterators): Add inline initialization.
>>>>>>                (_Safe_sequence_base::_M_const_iterators): Likewise.
>>>>>>                (_Safe_sequence_base::_M_version): Likewise.
>>>>>>                [__cplusplus < 201103L](_Safe_sequence_base()): Value
>>>>>> initialize members.
>>>>>>                [__cplusplus >= 201103L](_Safe_sequence_base()): Default
>>>>>> implementation.
>>>>>>                [__cplusplus < 201103L](_Safe_sequence_base(const
>>>>>> _Safe_sequence_base&)): New.
>>>>>>
>>>>>> Tested under Linux x86_64 C++98 and C++20 _GLIBCXX_DEBUG mode.
>>>>>>
>>>>>> Ok to commit ?
>>>>>>
>>>>>> François
>>>>>>


More information about the Libstdc++ mailing list