[PATCH][_GLIBCXX_DEBUG] _Safe_iterator_base/_Safe_sequence_base code cleanup

Jonathan Wakely jwakely@redhat.com
Mon Oct 5 17:43:13 GMT 2026


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