On Mon, 2 Mar 2026 at 18:53, François Dumont <[email protected]> wrote:
>
>      libstdc++: [_GLIBCXX_DEBUG][__cplusplus >= 201103L] Remove useless
> workaround
>
>      Starting with C++11 we leverage on template parameter requirement
> to prevent
>      instantiation of methods taking iterators with invalid types.
>      So the _GLIBCXX_DEBUG mode do not need to check for potential
> ambiguity between
>      integer type and iterator type anymore.

OK for trunk, thanks.


>
>      libstdc++-v3/ChangeLog:
>
>              * include/debug/functions.h [__cplusplus >= 201103L]
>              (__foreign_iterator_aux): Remove.
>              (__foreign_iterator): Adapt to use __foreign_iterator_aux2.
>              * include/debug/helper_functions.h [__cplusplus >= 201103L]:
>              Remove include bits/cpp_type_traits.h.
>              (_Distance_traits<_Integral, std::__true_type>): Remove.
>              (__valid_range_aux(_Integral, _Integral, std::__true_type)):
>              Remove.
>              (__valid_range_aux(_Iterator, _Iterator,
> std::__false_type)): Remove.
>              (__valid_range_aux(_Integral, _Integral,
> _Distance_traits<_Integral>::__type&,
>              std::__true_type)): Remove.
>              (__valid_range_aux(_Iterator, _Iterator,
> _Distance_traits<_Iterator>::__type&,
>              std::__false_type)): Remove.
>              (__valid_range(_Iterator, _Iterator)): Adapt.
>              (__valid_range(_Iterator, _Iterator,
> _Distance_traits<_Iterator>::__type&)): Adapt.
>
>
> On 3/2/26 11:55, Jonathan Wakely wrote:
> > On Mon, 02 Mar 2026 at 07:00 +0100, François Dumont wrote:
> >> Hi
> >>
> >>     libstdc++: [_GLIBCXX_DEBUG][__cplusplus >= 201103L] Remove
> >> useless workaround
> >>
> >>     Starting with C++11 we leverage on template parameter requirement
> >> to prevent
> >>     instantiation of methods taking iterators with invalid types.
> >>     So the _GLIBCXX_DEBUG mode do not need to check for potential
> >> ambiguity between
> >>     integer type and iterator type anymore.
> >>
> >>     libstdc++-v3/ChangeLog:
> >>
> >>             * include/debug/functions.h
> >>             [__cplusplus >= 201103L](__foreign_iterator_aux): Remove.
> >>             [__cplusplus >= 201103L](__foreign_iterator): Adapt to
> >> use __foreign_iterator_aux2.
> >
> > You can just name the [condition] once per file when it applies to all
> > changes, e.g.
> >
> >         * include/debug/functions.h [__cplusplus >= 201103L]
> >         (__foreign_iterator_aux): Remove.
> >         (__foreign_iterator): Adapt to use __foreign_iterator_aux2.
> >
> >
> >
> >>             * include/debug/helper_functions.h
> >>             [__cplusplus >= 201103L]: Remove include
> >> bits/cpp_type_traits.h.
> >>             [__cplusplus >= 201103L](_Distance_traits<_Integral,
> >> std::__true_type>): Remove.
> >>             [__cplusplus >= 201103L](__valid_range_aux(_Integral,
> >> _Integral, std::__true_type)):
> >>             Remove.
> >>             [__cplusplus >= 201103L](__valid_range_aux(_Iterator,
> >> _Iterator, std::__false_type)):
> >>             Remove.
> >>             [__cplusplus >= 201103L]
> >>             (__valid_range_aux(_Integral, _Integral,
> >> _Distance_traits<_Integral>::__type&,
> >>             std::__true_type)): Remove.
> >>             [__cplusplus >= 201103L]
> >>             (__valid_range_aux(_Iterator, _Iterator,
> >> _Distance_traits<_Iterator>::__type&,
> >>             std::__false_type)): Remove.
> >>             [__cplusplus >= 201103L](__valid_range(_Iterator,
> >> _Iterator)): Adapt.
> >>             [__cplusplus >= 201103L]
> >>             (__valid_range(_Iterator, _Iterator,
> >> _Distance_traits<_Iterator>::__type&)): Adapt.
> >>
> >> Tested under Linux x64 _GLIBCXX_DEBUG mode.
> >>
> >> Ok to commit ?
> >
> > Some questions below ...
> >
> >> François
> >>
> >
> >> diff --git a/libstdc++-v3/include/debug/functions.h
> >> b/libstdc++-v3/include/debug/functions.h
> >> index 99a0c41758d..d2acba34ef2 100644
> >> --- a/libstdc++-v3/include/debug/functions.h
> >> +++ b/libstdc++-v3/include/debug/functions.h
> >> @@ -168,6 +168,7 @@ namespace __gnu_debug
> >>       return __foreign_iterator_aux3(__it, __other, __other_end,
> >> __tag());
> >>     }
> >>
> >> +#if __cplusplus < 201103L
> >>   /* Handle the case where we aren't really inserting a range after
> >> all */
> >>   template<typename _Iterator, typename _Sequence, typename _Category,
> >>        typename _Integral>
> >> @@ -185,12 +186,21 @@ namespace __gnu_debug
> >>     const _Safe_iterator<_Iterator, _Sequence, _Category>& __it,
> >>     _InputIterator __other, _InputIterator __other_end,
> >>     std::__false_type)
> >> +#else
> >> +  template<typename _Iterator, typename _Sequence, typename _Category,
> >> +       typename _InputIterator>
> >> +    inline bool
> >> +    __foreign_iterator(
> >> +    const _Safe_iterator<_Iterator, _Sequence, _Category>& __it,
> >> +    _InputIterator __other, _InputIterator __other_end)
> >> +#endif
> >>     {
> >>       return _Insert_range_from_self_is_safe<_Sequence>::__value
> >>     || __foreign_iterator_aux2(__it, std::__miter_base(__other),
> >>                    std::__miter_base(__other_end));
> >>     }
> >>
> >> +#if __cplusplus < 201103L
> >>   template<typename _Iterator, typename _Sequence, typename _Category,
> >>        typename _InputIterator>
> >>     inline bool
> >> @@ -201,6 +211,7 @@ namespace __gnu_debug
> >>       typedef typename std::__is_integer<_InputIterator>::__type
> >> _Integral;
> >>       return __foreign_iterator_aux(__it, __other, __other_end,
> >> _Integral());
> >>     }
> >> +#endif
> >>
> >>   // Can't check if an input iterator sequence is sorted, because we
> >>   // can't step through the sequence.
> >> diff --git a/libstdc++-v3/include/debug/helper_functions.h
> >> b/libstdc++-v3/include/debug/helper_functions.h
> >> index 8ef21684650..43072874590 100644
> >> --- a/libstdc++-v3/include/debug/helper_functions.h
> >> +++ b/libstdc++-v3/include/debug/helper_functions.h
> >> @@ -32,7 +32,9 @@
> >> #include <bits/move.h>                // for __addressof
> >> #include <bits/stl_iterator_base_types.h>    // for iterator_traits,
> >>                         // categories and _Iter_base
> >> -#include <bits/cpp_type_traits.h>        // for __is_integer
> >> +#if __cplusplus < 201103L
> >> +# include <bits/cpp_type_traits.h>        // for __is_integer
> >> +#endif
> >>
> >> #include <bits/stl_pair.h>            // for pair
> >>
> >> @@ -58,8 +60,12 @@ namespace __gnu_debug
> >>       __dp_exact        //< Can determine distance precisely
> >>     };
> >>
> >> +#if __cplusplus >= 201103L
> >> +  template<typename _Iterator>
> >> +#else
> >>   template<typename _Iterator,
> >>        typename = typename std::__is_integer<_Iterator>::__type>
> >> +#endif
> >>     struct _Distance_traits
> >>     {
> >>     private:
> >> @@ -80,9 +86,11 @@ namespace __gnu_debug
> >>       typedef std::pair<_DiffType, _Distance_precision> __type;
> >>     };
> >>
> >> +#if __cplusplus < 201103L
> >>   template<typename _Integral>
> >>     struct _Distance_traits<_Integral, std::__true_type>
> >>     { typedef std::pair<std::ptrdiff_t, _Distance_precision> __type; };
> >> +#endif
> >>
> >>   /** Determine the distance between two iterators with some known
> >>    *    precision.
> >> @@ -141,18 +149,16 @@ namespace __gnu_debug
> >>     __check_singular(_Tp* const& __ptr)
> >>     { return __ptr == 0; }
> >>
> >> +#if __cplusplus < 201103L
> >>   /** We say that integral types for a valid range, and defer to other
> >
> > Is this meant to say "form a valid range"?
>
> I did not reconsider those comments. No idea what it was supposed to
> say. I guess it was meant to cover the different functions following it.
> I've simplified it.
>
>
> >
> >>    *  routines to realize what to do with integral types instead of
> >> -   *  iterators.
> >> -  */
> >> +   *  iterators. */
> >
> > Was this change an accident? We usually end the doxygen comment on a
> > separate line.
>
> I thought both forms were fine but the only similar form I can find are
> mine so reverted.
>
>
> >
> >>   template<typename _Integral>
> >> -    _GLIBCXX_CONSTEXPR
> >>     inline bool
> >>     __valid_range_aux(_Integral, _Integral, std::__true_type)
> >>     { return true; }
> >>
> >>   template<typename _Integral>
> >> -    _GLIBCXX20_CONSTEXPR
> >>     inline bool
> >>     __valid_range_aux(_Integral, _Integral,
> >>               typename _Distance_traits<_Integral>::__type& __dist,
> >> @@ -161,6 +167,7 @@ namespace __gnu_debug
> >>       __dist = std::make_pair(0, __dp_none);
> >>       return true;
> >>     }
> >> +#endif
> >>
> >>   template<typename _InputIterator>
> >>     _GLIBCXX_CONSTEXPR
> >> @@ -189,25 +196,36 @@ namespace __gnu_debug
> >>     && __first <= __last;
> >>     }
> >>
> >> +#if __cplusplus >= 201103L
> >> +  template<typename _InputIterator>
> >> +    constexpr bool
> >
> > It looks like this changes the function from being
> > _GLIBCXX14_CONSTEXPR to always constexpr in C++11. I think that's OK.
>
> I hadn't noticed it ! I just reflected what was on __valid_range_aux
> below, we had a _GLIBCXX14_CONSTEXPR function invoking only function
> overloads qualified as _GLIBCXX_CONSTEXPR. So indeed defining it as
> constexpr directly is fine.
>
>
> >
> >> +    __valid_range(_InputIterator __first, _InputIterator __last)
> >> +#else
> >>   /** We have iterators, so figure out what kind of iterators they are
> >> -   *  to see if we can check the range ahead of time.
> >> -  */
> >> +   *  to see if we can check the range ahead of time. */
> >
> > Same question about the comment as above.
> >
> >>   template<typename _InputIterator>
> >> -    _GLIBCXX_CONSTEXPR
> >>     inline bool
> >>     __valid_range_aux(_InputIterator __first, _InputIterator __last,
> >>               std::__false_type)
> >> +#endif
> >>     {
> >>       return __gnu_debug::__valid_range_aux(__first, __last,
> >>                         std::__iterator_category(__first));
> >>     }
> >>
> >> +#if __cplusplus >= 201103L
> >>   template<typename _InputIterator>
> >>     _GLIBCXX20_CONSTEXPR
> >> +    inline bool
> >> +    __valid_range(_InputIterator __first, _InputIterator __last,
> >> +          typename _Distance_traits<_InputIterator>::__type& __dist)
> >> +#else
> >> +  template<typename _InputIterator>
> >>     inline bool
> >>     __valid_range_aux(_InputIterator __first, _InputIterator __last,
> >>               typename _Distance_traits<_InputIterator>::__type& __dist,
> >>               std::__false_type)
> >> +#endif
> >>     {
> >>       if (!__gnu_debug::__valid_range_aux(__first, __last,
> >>                       std::input_iterator_tag()))
> >> @@ -232,13 +250,12 @@ namespace __gnu_debug
> >>       return true;
> >>     }
> >>
> >> +#if __cplusplus < 201103L
> >>   /** Don't know what these iterators are, or if they are even
> >>    *  iterators (we may get an integral type for InputIterator), so
> >>    *  see if they are integral and pass them on to the next phase
> >> -   *  otherwise.
> >> -  */
> >> +   *  otherwise. */
> >
> > OK, it's not looking like an accident now :-)
> > These changes are not following our usual convention.
>
> Yes, reverted.
>
>
> >
> >>   template<typename _InputIterator>
> >> -    _GLIBCXX20_CONSTEXPR
> >>     inline bool
> >>     __valid_range(_InputIterator __first, _InputIterator __last,
> >>           typename _Distance_traits<_InputIterator>::__type& __dist)
> >> @@ -247,6 +264,7 @@ namespace __gnu_debug
> >>       return __gnu_debug::__valid_range_aux(__first, __last, __dist,
> >>                         _Integral());
> >>     }
> >> +#endif
> >>
> >>   template<typename _Iterator, typename _Sequence, typename _Category>
> >>     _GLIBCXX20_CONSTEXPR bool
> >> @@ -262,14 +280,15 @@ namespace __gnu_debug
> >>           typename _Distance_traits<_Iterator>::__type&);
> >> #endif
> >>
> >> +#if __cplusplus < 201103L
> >>   template<typename _InputIterator>
> >> -    _GLIBCXX14_CONSTEXPR
> >>     inline bool
> >>     __valid_range(_InputIterator __first, _InputIterator __last)
> >>     {
> >>       typedef typename std::__is_integer<_InputIterator>::__type
> >> _Integral;
> >>       return __gnu_debug::__valid_range_aux(__first, __last,
> >> _Integral());
> >>     }
> >> +#endif
> >>
> >>   template<typename _Iterator, typename _Sequence, typename _Category>
> >>     _GLIBCXX20_CONSTEXPR bool
> >
> Ok to commit ?
>
> François
>

Reply via email to