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 <[email protected]> wrote:
On Mon, 5 Oct 2026 at 18:34, François Dumont <[email protected]> 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 <[email protected]> wrote:
On Thu, 1 Oct 2026 at 18:29, François Dumont <[email protected]> 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

Reply via email to