On 14/02/2024 20:44, Jonathan Wakely wrote: > > > On Wed, 14 Feb 2024 at 18:39, François Dumont > wrote: > > libstdc++: [_GLIBCXX_DEBUG] Fix std::__niter_base behavior > > std::__niter_base is used in _GLIBCXX_DEBUG mode to remove > _Safe_iterator<> > wrapper on random access iterators. But doing so it should also > preserve > original > behavior to remove __normal_iterator wrapper. > > libstdc++-v3/ChangeLog: > >      * include/bits/stl_algobase.h (std::__niter_base): Redefine the > overload >      definitions for __gnu_debug::_Safe_iterator. >      * include/debug/safe_iterator.tcc (std::__niter_base): Adapt > declarations. > > Ok to commit once all tests completed (still need to check > pre-c++11) ? > > > > The declaration in  include/bits/stl_algobase.h has a > noexcept-specifier but the definition in > include/debug/safe_iterator.tcc does not have one - that seems wrong > (I'm surprised it even compiles). It does ! I thought it was only necessary at declaration, and I also had troubles doing it right at definition because of the interaction with the auto and ->. Now simplified and consistent in this new proposal. > Just using std::is_nothrow_copy_constructible<_Ite> seems simpler, > that will be true for __normal_iterator if > is_nothrow_copy_constructible is true. > Ok > The definition in include/debug/safe_iterator.tcc should use > std::declval<_Ite>() not declval<_Ite>(). Is there any reason why the > definition uses a late-specified-return-type (i.e. auto and ->) when > the declaration doesn't? > > I initially plan to use '-> std::decltype(std::__niter_base(__it.base()))' but this did not compile, ambiguity issue. So I resort to using std::declval and I could have then done it the same way as declaration, done now. Attached is what I'm testing, ok to commit once fully tested ? François