On Sun, 18 Apr 2021, 15:01 François Dumont via Libstdc++, < libstd...@gcc.gnu.org> wrote:
> Hi > > Ok to backport this to gcc-10 branch ? > Yes please, thanks. > Tested under Linux x86_64. > > François > > > On 13/04/21 10:51 pm, redi at gcc dot gnu.org wrote: > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99402 > > > > Jonathan Wakely <redi at gcc dot gnu.org> changed: > > > > What |Removed |Added > > > ---------------------------------------------------------------------------- > > Summary|[10/11 Regression] |[10 Regression] > std::copy > > |std::copy creates |creates _GLIBCXX_DEBUG > > |_GLIBCXX_DEBUG false |false positive for > attempt > > |positive for attempt to |to subscript a > > |subscript a dereferenceable |dereferenceable > > |(start-of-sequence) |(start-of-sequence) > > |iterator |iterator > > > > --- Comment #10 from Jonathan Wakely <redi at gcc dot gnu.org> --- > > This was fixed on trunk by r11-8100: > > > > 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<difference_type, _Distance_precision>&, 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. > > > >