diff --git a/stl/inc/ranges b/stl/inc/ranges index 9fb90a450b..9e9b9b1c6f 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -6168,7 +6168,11 @@ namespace ranges { public: constexpr explicit slide_view(_Vw _Range_, const range_difference_t<_Vw> _Count_) noexcept( is_nothrow_move_constructible_v<_Vw>) /* strengthened */ - : _Range(_STD move(_Range_)), _Count{_Count_} {} + : _Range(_STD move(_Range_)), _Count{_Count_} { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Count > 0, "The window size must be positive (N4917 [range.slide.view]/1)"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 + } // clang-format off _NODISCARD constexpr auto begin() requires (!(_Simple_view<_Vw> && _Slide_caches_nothing) ) { diff --git a/tests/std/test.lst b/tests/std/test.lst index f63c48e1b1..c48a7ce349 100644 --- a/tests/std/test.lst +++ b/tests/std/test.lst @@ -560,6 +560,7 @@ tests\P2441R2_views_join_with tests\P2442R1_views_chunk tests\P2442R1_views_chunk_death tests\P2442R1_views_slide +tests\P2442R1_views_slide_death tests\P2443R1_views_chunk_by tests\P2443R1_views_chunk_by_death tests\P2445R1_forward_like diff --git a/tests/std/tests/P2442R1_views_slide_death/env.lst b/tests/std/tests/P2442R1_views_slide_death/env.lst new file mode 100644 index 0000000000..18e2d7c71e --- /dev/null +++ b/tests/std/tests/P2442R1_views_slide_death/env.lst @@ -0,0 +1,4 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +RUNALL_INCLUDE ..\concepts_latest_matrix.lst diff --git a/tests/std/tests/P2442R1_views_slide_death/test.cpp b/tests/std/tests/P2442R1_views_slide_death/test.cpp new file mode 100644 index 0000000000..794f1e6907 --- /dev/null +++ b/tests/std/tests/P2442R1_views_slide_death/test.cpp @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#define _CONTAINER_DEBUG_LEVEL 1 + +#include + +#include + +using namespace std; +using ranges::slide_view; + +static constexpr int some_ints[] = {0, 1, 2, 3}; + +void test_view_negative_window_size() { + slide_view(some_ints, -1); // window size must be positive +} + +void test_view_zero_window_size() { + slide_view(some_ints, 0); // window size must be positive +} + +int main(int argc, char* argv[]) { + std_testing::death_test_executive exec; + + exec.add_death_tests({ + test_view_negative_window_size, + test_view_zero_window_size, + }); + + return exec.run(argc, argv); +}