Index: libcxx/include/__iterator/counted_iterator.h =================================================================== --- libcxx/include/__iterator/counted_iterator.h +++ libcxx/include/__iterator/counted_iterator.h @@ -96,7 +96,7 @@ } _LIBCPP_HIDE_FROM_ABI - constexpr const _Iter& base() const& { return __current_; } + constexpr const _Iter& base() const& noexcept { return __current_; } _LIBCPP_HIDE_FROM_ABI constexpr _Iter base() && { return _VSTD::move(__current_); } Index: libcxx/include/__ranges/transform_view.h =================================================================== --- libcxx/include/__ranges/transform_view.h +++ libcxx/include/__ranges/transform_view.h @@ -195,9 +195,7 @@ : __parent_(__i.__parent_), __current_(_VSTD::move(__i.__current_)) {} _LIBCPP_HIDE_FROM_ABI - constexpr iterator_t<_Base> base() const& - requires copyable> - { + constexpr const iterator_t<_Base>& base() const& noexcept { return __current_; } Index: libcxx/test/std/iterators/predef.iterators/counted.iterator/base.pass.cpp =================================================================== --- libcxx/test/std/iterators/predef.iterators/counted.iterator/base.pass.cpp +++ libcxx/test/std/iterators/predef.iterators/counted.iterator/base.pass.cpp @@ -32,17 +32,18 @@ { std::counted_iterator iter(cpp20_input_iterator{buffer}, 8); - assert(iter.base().base() == buffer); - assert(std::move(iter).base().base() == buffer); + assert(base(iter.base()) == buffer); + assert(base(std::move(iter).base()) == buffer); + ASSERT_NOEXCEPT(iter.base()); ASSERT_SAME_TYPE(decltype(iter.base()), const cpp20_input_iterator&); ASSERT_SAME_TYPE(decltype(std::move(iter).base()), cpp20_input_iterator); } { std::counted_iterator iter(forward_iterator{buffer}, 8); - assert(iter.base() == forward_iterator{buffer}); - assert(std::move(iter).base() == forward_iterator{buffer}); + assert(base(iter.base()) == buffer); + assert(base(std::move(iter).base()) == buffer); ASSERT_SAME_TYPE(decltype(iter.base()), const forward_iterator&); ASSERT_SAME_TYPE(decltype(std::move(iter).base()), forward_iterator); @@ -50,8 +51,8 @@ { std::counted_iterator iter(contiguous_iterator{buffer}, 8); - assert(iter.base() == contiguous_iterator{buffer}); - assert(std::move(iter).base() == contiguous_iterator{buffer}); + assert(base(iter.base()) == buffer); + assert(base(std::move(iter).base()) == buffer); ASSERT_SAME_TYPE(decltype(iter.base()), const contiguous_iterator&); ASSERT_SAME_TYPE(decltype(std::move(iter).base()), contiguous_iterator); @@ -68,8 +69,8 @@ { const std::counted_iterator iter(cpp20_input_iterator{buffer}, 8); - assert(iter.base().base() == buffer); - assert(std::move(iter).base().base() == buffer); + assert(base(iter.base()) == buffer); + assert(base(std::move(iter).base()) == buffer); ASSERT_SAME_TYPE(decltype(iter.base()), const cpp20_input_iterator&); ASSERT_SAME_TYPE(decltype(std::move(iter).base()), const cpp20_input_iterator&); @@ -77,8 +78,8 @@ { const std::counted_iterator iter(forward_iterator{buffer}, 7); - assert(iter.base() == forward_iterator{buffer}); - assert(std::move(iter).base() == forward_iterator{buffer}); + assert(base(iter.base()) == buffer); + assert(base(std::move(iter).base()) == buffer); ASSERT_SAME_TYPE(decltype(iter.base()), const forward_iterator&); ASSERT_SAME_TYPE(decltype(std::move(iter).base()), const forward_iterator&); @@ -86,8 +87,8 @@ { const std::counted_iterator iter(contiguous_iterator{buffer}, 6); - assert(iter.base() == contiguous_iterator{buffer}); - assert(std::move(iter).base() == contiguous_iterator{buffer}); + assert(base(iter.base()) == buffer); + assert(base(std::move(iter).base()) == buffer); ASSERT_SAME_TYPE(decltype(iter.base()), const contiguous_iterator&); ASSERT_SAME_TYPE(decltype(std::move(iter).base()), const contiguous_iterator&); Index: libcxx/test/std/ranges/range.adaptors/range.transform/iterator/base.pass.cpp =================================================================== --- libcxx/test/std/ranges/range.adaptors/range.transform/iterator/base.pass.cpp +++ libcxx/test/std/ranges/range.adaptors/range.transform/iterator/base.pass.cpp @@ -28,6 +28,7 @@ TransformView tv; auto begin = tv.begin(); ASSERT_SAME_TYPE(decltype(begin.base()), int*); + ASSERT_NOEXCEPT(begin.base()); assert(begin.base() == globalBuff); ASSERT_SAME_TYPE(decltype(std::move(begin).base()), int*); assert(std::move(begin).base() == globalBuff);