On Mon, 9 Mar 2026 at 21:13, François Dumont <[email protected]> wrote: > > Looks like another occurrence of the lack of maintenance of > __gnu_debug::basic_string, sorry. > > Here is I think the patch to fix it. > > libstdc++: [_GLIBCXX_DEBUG] Constrain basic_string iterator constructor > > Constrain __gnu_debug::basic_string(_Ite, _Ite, const _Alloc&) _Ite > template > parameter so that it is an iterator type. > > libstdc++-v3/ChangeLog: > > * include/debug/string > [__cplusplus >= 201103L](basic_string(_Ite, _Ite, const > _Alloc&)): Add > std::_RequireInputIter<_Ite> template parameter. > > Almost simple enough to commit myself but in this kind of situation I > prefer to ask. > > Ok to commit ?
Ah nice, that is just a simple fix. OK, thanks! > > François > > > On 3/9/26 12:05, Jonathan Wakely wrote: > > On Mon, 9 Mar 2026 at 11:04, Tomasz Kaminski <[email protected]> wrote: > >> I believe, this caused failure > >> 21_strings/basic_string/requirements/dr438/constructor.c in C++20 mode:: > >> In file included from > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/functions.h:39, > >> from > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/safe_sequence.h:34, > >> from > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/string:37, > >> from > >> /home/tkaminsk/src/gcc/libstdc++-v3/testsuite/21_strings/basic_string/requirements/dr438/constructor.cc:23: > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/helper_functions.h: > >> In instantiation of 'constexpr bool > >> __gnu_debug::__valid_range(_InputIterator, _InputIterator) [with > >> _InputIterator = int]': > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/functions.h:65: > >> required from 'constexpr _InputIterator > >> __gnu_debug::__check_valid_range(const _InputIterator&, const > >> _InputIterator&, const char*, unsigned int, const char*) [with > >> _InputIterator = int]' > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/string:238: > >> required from '__gnu_debug::basic_string<_CharT, _Traits, > >> _Allocator>::basic_string(_InputIterator, _InputIterator, const > >> _Allocator&) [with _InputIterator = int; _CharT = char; _Traits = > >> std::char_traits<char>; _Allocator = std::allocator<char>]' > >> /home/tkaminsk/src/gcc/libstdc++-v3/testsuite/21_strings/basic_string/requirements/dr438/constructor.cc:28: > >> required from here > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/helper_functions.h:212: > >> error: no matching function for call to '__iterator_category(int&)' > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/helper_functions.h:212: > >> note: there is 1 candidate > >> In file included from > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_construct.h:61, > >> from > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/char_traits.h:59, > >> from > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/string:45, > >> from > >> /home/tkaminsk/src/gcc/libstdc++-v3/testsuite/21_strings/basic_string/requirements/dr438/constructor.cc:22: > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_iterator_base_types.h:241: > >> note: candidate 1: 'template<class _Iter> constexpr typename > >> std::iterator_traits<_Iterator>::iterator_category > >> std::__iterator_category(const _Iter&)' > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_iterator_base_types.h:241: > >> note: template argument deduction/substitution failed: > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_iterator_base_types.h: > >> In substitution of 'template<class _Iter> constexpr typename > >> std::iterator_traits<_Iterator>::iterator_category > >> std::__iterator_category(const _Iter&) [with _Iter = int]': > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/helper_functions.h:212: > >> required from 'constexpr bool > >> __gnu_debug::__valid_range(_InputIterator, _InputIterator) [with > >> _InputIterator = int]' > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/functions.h:65: > >> required from 'constexpr _InputIterator > >> __gnu_debug::__check_valid_range(const _InputIterator&, const > >> _InputIterator&, const char*, unsigned int, const char*) [with > >> _InputIterator = int]' > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/string:238: > >> required from '__gnu_debug::basic_string<_CharT, _Traits, > >> _Allocator>::basic_string(_InputIterator, _InputIterator, const > >> _Allocator&) [with _InputIterator = int; _CharT = char; _Traits = > >> std::char_traits<char>; _Allocator = std::allocator<char>]' > >> /home/tkaminsk/src/gcc/libstdc++-v3/testsuite/21_strings/basic_string/requirements/dr438/constructor.cc:28: > >> required from here > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_iterator_base_types.h:241: > >> error: no type named 'iterator_category' in 'struct > >> std::iterator_traits<int>' > >> compiler exited with status 1 > >> FAIL: 21_strings/basic_string/requirements/dr438/constructor.cc > >> -std=gnu++20 (test for excess errors) > >> Excess errors: > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/helper_functions.h:212: > >> error: no matching function for call to '__iterator_category(int&)' > >> /home/tkaminsk/build/gcc/16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_iterator_base_types.h:241: > >> error: no type named 'iterator_category' in 'struct > >> std::iterator_traits<int>' > > This looks like *exactly* the error that the workaround was protecting > > against. So it's not so useless. > > > > > >> > >> On Mon, Mar 2, 2026 at 7:00 AM François Dumont <[email protected]> > >> 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. > >>> * 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 ? > >>> > >>> François > >>>
