I eventually prefer to propose this version. Compared to the previous one I have the _M_can_advance calling the former one with correct number of elements to check for advance. And the former _M_can_advance is also properly making use of the __dp_sign_max_size precision. Here is the revisited git log:     libstdc++: [_GLIBCXX_DEBUG] Fix management of __dp_sign_max_size [PR 99402]     __dp_sign precision indicates that we found out what iterator comes first or     last in the range. __dp_sign_max_size is the same plus it gives the information     of the max size of the range that is to say the max_size value such that     distance(lhs, rhs) < max_size.     Thanks to this additional information we are able to tell when a copy of n elements     to that range will fail even if we do not know exactly how large it is.     This patch makes sure that we are properly using this information.     libstdc++-v3/ChangeLog:             PR libstdc++/99402             * include/debug/helper_functions.h (__can_advance(_InputIterator,             const std::pair<_Diff, _Distance_precision>&, int)): New.             (__can_advance(const _Safe_iterator<>&,             const std::pair<_Diff, _Distance_precision>&, int)): New.             * include/debug/macros.h (__glibcxx_check_can_increment_dist): New,             use latter.             (__glibcxx_check_can_increment_range): Adapt to use latter.             (__glibcxx_check_can_decrement_range): Likewise.             * include/debug/safe_iterator.h             (_Safe_iterator<>::_M_can_advance(const std::pair<_Diff, _Distance_precision>&,             int)): New.             (__can_advance(const _Safe_iterator<>&,             const std::pair<_Diff, _Distance_precision>&, int)): New.             * include/debug/safe_iterator.tcc             (_Safe_iterator<>::_M_can_advance(const std::pair<_Diff, _Distance_precision>&,             int)): New.             (_Safe_iterator<>::_M_valid_range(const _Safe_iterator<>&,             std::pair&, bool)): Adapt for             __dp_sign_max_size.             (__copy_move_a): Adapt to use __glibcxx_check_can_increment_dist.             (__copy_move_backward_a): Likewise.             (__equal_aux): Likewise.             * include/debug/stl_iterator.h (__can_advance(const std::reverse_iterator<>&,             const std::pair<_Diff, _Distance_precision>&, int)): New.             (__can_advance(const std::move_iterator<>&,             const std::pair<_Diff, _Distance_precision>&, int)): New.             * testsuite/25_algorithms/copy/debug/99402.cc: New test. Ok to commit if tests are all PASS ? François On 07/03/21 10:30 pm, François Dumont wrote: > Here is the patch to correctly deal with the new __dp_sign_max_size. > > I prefer to introduce new __can_advance overloads for this to > correctly deal with the _Distance_precision in it. _M_valid_range was > also ignoring __dp_sign_max_size. > >     libstdc++: [_GLIBCXX_DEBUG] Fix management of __dp_sign_max_size > [PR 99402] > >     libstdc++-v3/ChangeLog: > >             PR libstdc++/99402 >             * include/debug/helper_functions.h > (__can_advance(_InputIterator, >             const std::pair<_Diff, _Distance_precision>&, int)): New. >             (__can_advance(const _Safe_iterator<>&, >             const std::pair<_Diff, _Distance_precision>&, int)): New. >             * include/debug/macros.h > (__glibcxx_check_can_increment_dist): New, >             use latter. >             (__glibcxx_check_can_increment_range): Adapt to use latter. >             (__glibcxx_check_can_decrement_range): Likewise. >             * include/debug/safe_iterator.h >             (_Safe_iterator<>::_M_can_advance(const std::pair<_Diff, > _Distance_precision>&, >             int)): New. >             (__can_advance(const _Safe_iterator<>&, >             const std::pair<_Diff, _Distance_precision>&, int)): New. >             * include/debug/safe_iterator.tcc >             (_Safe_iterator<>::_M_can_advance(const std::pair<_Diff, > _Distance_precision>&, >             int)): New. >             (_Safe_iterator<>::_M_valid_range(const _Safe_iterator<>&, >             std::pair&, bool)): > Adapt for >             __dp_sign_max_size. >             (__copy_move_a): Adapt to use > __glibcxx_check_can_increment_dist. >             (__copy_move_backward_a): Likewise. >             (__equal_aux): Likewise. >             * include/debug/stl_iterator.h (__can_advance(const > std::reverse_iterator<>&, >             const std::pair<_Diff, _Distance_precision>&, int)): New. >             (__can_advance(const std::move_iterator<>&, >             const std::pair<_Diff, _Distance_precision>&, int)): New. >             * testsuite/25_algorithms/copy/debug/99402.cc: New test. > > Tested under Linux x86_64. > > Ok to commit ? > > François >