https://gcc.gnu.org/g:01c4d1fe251896c25dee7902cf2922927ce4906e
commit r15-4271-g01c4d1fe251896c25dee7902cf2922927ce4906e Author: Jonathan Wakely <jwak...@redhat.com> Date: Thu Oct 10 22:47:46 2024 +0100 libstdc++: Rearrange std::move_iterator helpers in stl_iterator.h The __niter_base(move_iterator<I>) overload and __is_move_iterator trait were originally immediately after the definition of move_iterator. The addition of C++20 features after move_iterator meant that those helpers were no longer anywhere near move_iterator. This change puts them back where they used to be, before all the new C++20 additions. libstdc++-v3/ChangeLog: * include/bits/stl_iterator.h (__niter_base(move_iterator<I>)) (__is_move_iterator, __miter_base, _GLIBCXX_MAKE_MOVE_ITERATOR) (_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR): Move earlier in the file. Diff: --- libstdc++-v3/include/bits/stl_iterator.h | 63 ++++++++++++++++---------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index 20c0319f3a7a..28a600c81cb2 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -1349,9 +1349,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value) { return __it.base(); } -#if __cplusplus >= 201103L - -#if __cplusplus <= 201703L +#if __cplusplus >= 201103L && __cplusplus <= 201703L // Need to overload __to_address because the pointer_traits primary template // will deduce element_type of __normal_iterator<T*, C> as T* rather than T. template<typename _Iterator, typename _Container> @@ -1362,6 +1360,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return std::__to_address(__it.base()); } #endif +#if __cplusplus >= 201103L /** * @addtogroup iterators * @{ @@ -1821,6 +1820,35 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __make_move_if_noexcept_iterator(_Tp* __i) { return _ReturnType(__i); } + template<typename _Iterator> + _GLIBCXX20_CONSTEXPR + auto + __niter_base(move_iterator<_Iterator> __it) + -> decltype(make_move_iterator(__niter_base(__it.base()))) + { return make_move_iterator(__niter_base(__it.base())); } + + template<typename _Iterator> + struct __is_move_iterator<move_iterator<_Iterator> > + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<typename _Iterator> + _GLIBCXX20_CONSTEXPR + auto + __miter_base(move_iterator<_Iterator> __it) + -> decltype(__miter_base(__it.base())) + { return __miter_base(__it.base()); } + +#define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter) +#define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \ + std::__make_move_if_noexcept_iterator(_Iter) +#else +#define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter) +#define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter) +#endif // C++11 + #if __cplusplus > 201703L && __glibcxx_concepts // _GLIBCXX_RESOLVE_LIB_DEFECTS // 3736. move_iterator missing disable_sized_sentinel_for specialization @@ -2957,35 +2985,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// @} group iterators - template<typename _Iterator> - _GLIBCXX20_CONSTEXPR - auto - __niter_base(move_iterator<_Iterator> __it) - -> decltype(make_move_iterator(__niter_base(__it.base()))) - { return make_move_iterator(__niter_base(__it.base())); } - - template<typename _Iterator> - struct __is_move_iterator<move_iterator<_Iterator> > - { - enum { __value = 1 }; - typedef __true_type __type; - }; - - template<typename _Iterator> - _GLIBCXX20_CONSTEXPR - auto - __miter_base(move_iterator<_Iterator> __it) - -> decltype(__miter_base(__it.base())) - { return __miter_base(__it.base()); } - -#define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter) -#define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \ - std::__make_move_if_noexcept_iterator(_Iter) -#else -#define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter) -#define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter) -#endif // C++11 - #if __cpp_deduction_guides >= 201606 // These helper traits are used for deduction guides // of associative containers.