[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