diff options
-rw-r--r-- | gsl/multi_span | 4 | ||||
-rw-r--r-- | tests/multi_span_tests.cpp | 10 |
2 files changed, 10 insertions, 4 deletions
diff --git a/gsl/multi_span b/gsl/multi_span index 0abc7c1..40752aa 100644 --- a/gsl/multi_span +++ b/gsl/multi_span @@ -443,7 +443,7 @@ namespace details template <typename T, size_t Dim = 0> size_type linearize(const T& arr) const { - Expects(arr[Dim] < CurrentRange); // Index is out of range + Expects(arr[Dim] >= 0 && arr[Dim] < CurrentRange); // Index is out of range return this->Base::totalSize() * arr[Dim] + this->Base::template linearize<T, Dim + 1>(arr); } @@ -1510,7 +1510,7 @@ public: template <bool Enabled = (Rank > 1), typename Ret = std::enable_if_t<Enabled, sliced_type>> constexpr Ret operator[](size_type idx) const noexcept { - Expects(idx < bounds_.size()); // index is out of bounds of the array + Expects(idx >= 0 && idx < bounds_.size()); // index is out of bounds of the array const size_type ridx = idx * bounds_.stride(); // index is out of bounds of the underlying data diff --git a/tests/multi_span_tests.cpp b/tests/multi_span_tests.cpp index f04ba84..c0240ea 100644 --- a/tests/multi_span_tests.cpp +++ b/tests/multi_span_tests.cpp @@ -959,8 +959,8 @@ SUITE(multi_span_tests) } { - auto s1 = nullptr; - auto s2 = nullptr; + multi_span<int> s1 = nullptr; + multi_span<int> s2 = nullptr; CHECK(s1 == s2); CHECK(!(s1 != s2)); CHECK(!(s1 < s2)); @@ -1084,6 +1084,12 @@ SUITE(multi_span_tests) CHECK_THROW(av[10][2], fail_fast); CHECK_THROW((av[{10, 2}]), fail_fast); + + CHECK_THROW(av[-1][0], fail_fast); + CHECK_THROW((av[{-1, 0}]), fail_fast); + + CHECK_THROW(av[0][-1], fail_fast); + CHECK_THROW((av[{0, -1}]), fail_fast); } void overloaded_func(multi_span<const int, dynamic_range, 3, 5> exp, int expected_value) |