Skip to content

Commit 05252ff

Browse files
committed
Fix noexcept specification
1 parent d4c3384 commit 05252ff

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

stl/inc/ranges

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3771,13 +3771,16 @@ namespace ranges {
37713771
}
37723772

37733773
_NODISCARD constexpr decltype(auto) operator*() const
3774-
noexcept(noexcept(_STD get<_Index>(*_Current))) /* strengthened */ {
3775-
if constexpr (is_reference_v<range_reference_t<_Base>>) {
3776-
return _STD get<_Index>(*_Current);
3777-
} else {
3778-
using _ElemTy = remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>;
3779-
return static_cast<_ElemTy>(_STD get<_Index>(*_Current));
3780-
}
3774+
noexcept(noexcept(_STD get<_Index>(*_Current))) /* strengthened */
3775+
requires is_reference_v<range_reference_t<_Base>> {
3776+
return _STD get<_Index>(*_Current);
3777+
}
3778+
3779+
_NODISCARD constexpr decltype(auto) operator*() const noexcept(
3780+
is_nothrow_move_constructible_v<remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>> //
3781+
&& noexcept(_STD get<_Index>(*_Current))) /* strengthened */ {
3782+
using _ElemTy = remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>;
3783+
return static_cast<_ElemTy>(_STD get<_Index>(*_Current));
37813784
}
37823785

37833786
constexpr _Iterator& operator++() noexcept(noexcept(++_Current)) /* strengthened */ {
@@ -3840,16 +3843,22 @@ namespace ranges {
38403843

38413844
_NODISCARD constexpr decltype(auto) operator[](const difference_type _Idx) const
38423845
noexcept(noexcept(_STD get<_Index>(*(_Current + _Idx)))) /* strengthened */
3846+
requires random_access_range<_Base>&& is_reference_v<range_reference_t<_Base>> {
3847+
#if _ITERATOR_DEBUG_LEVEL != 0
3848+
_Verify_offset(_Idx);
3849+
#endif // _ITERATOR_DEBUG_LEVEL != 0
3850+
return _STD get<_Index>(*(_Current + _Idx));
3851+
}
3852+
3853+
_NODISCARD constexpr decltype(auto) operator[](const difference_type _Idx) const noexcept(
3854+
is_nothrow_move_constructible_v<remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>> //
3855+
&& noexcept(_STD get<_Index>(*(_Current + _Idx)))) /* strengthened */
38433856
requires random_access_range<_Base> {
38443857
#if _ITERATOR_DEBUG_LEVEL != 0
38453858
_Verify_offset(_Idx);
38463859
#endif // _ITERATOR_DEBUG_LEVEL != 0
3847-
if constexpr (is_reference_v<range_reference_t<_Base>>) {
3848-
return _STD get<_Index>(*(_Current + _Idx));
3849-
} else {
3850-
using _ElemTy = remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>;
3851-
return static_cast<_ElemTy>(_STD get<_Index>(*(_Current + _Idx)));
3852-
}
3860+
using _ElemTy = remove_cv_t<tuple_element_t<_Index, range_reference_t<_Base>>>;
3861+
return static_cast<_ElemTy>(_STD get<_Index>(*(_Current + _Idx)));
38533862
}
38543863

38553864
_NODISCARD friend constexpr bool operator==(const _Iterator& _Left, const _Iterator& _Right) noexcept(

tests/std/tests/P0896R4_views_drop/test.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,21 @@ int main() {
510510
test_one(lst, only_four_ints);
511511
}
512512

513+
// Validate a non-view borrowed range
514+
{
515+
constexpr span s{some_ints};
516+
STATIC_ASSERT(test_one(s, expected_output));
517+
test_one(s, expected_output);
518+
}
519+
520+
{ // Validate a view borrowed range
521+
522+
constexpr auto v =
523+
views::iota(0ull, ranges::size(some_ints)) | std::views::transform([](auto i) { return some_ints[i]; });
524+
STATIC_ASSERT(test_one(v));
525+
test_one(v);
526+
}
527+
513528
// Validate an output range
514529
STATIC_ASSERT((output_range_test(), true));
515530
output_range_test();

0 commit comments

Comments
 (0)