1 | //===----------------------------------------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | // REQUIRES: has-unix-headers |
10 | // UNSUPPORTED: c++03 |
11 | // UNSUPPORTED: libcpp-hardening-mode=none |
12 | // XFAIL: libcpp-hardening-mode=debug && availability-verbose_abort-missing |
13 | |
14 | // <array> |
15 | |
16 | // Test that operator[] triggers an assertion when accessing the array out-of-bounds. |
17 | |
18 | #include <array> |
19 | |
20 | #include "check_assertion.h" |
21 | |
22 | int main(int, char**) { |
23 | // Check with an empty array |
24 | { |
25 | { |
26 | using Array = std::array<int, 0>; |
27 | Array c = {}; |
28 | Array const& cc = c; |
29 | TEST_LIBCPP_ASSERT_FAILURE(c[0], "cannot call array<T, 0>::operator[] on a zero-sized array" ); |
30 | TEST_LIBCPP_ASSERT_FAILURE(c[1], "cannot call array<T, 0>::operator[] on a zero-sized array" ); |
31 | TEST_LIBCPP_ASSERT_FAILURE(cc[0], "cannot call array<T, 0>::operator[] on a zero-sized array" ); |
32 | TEST_LIBCPP_ASSERT_FAILURE(cc[1], "cannot call array<T, 0>::operator[] on a zero-sized array" ); |
33 | } |
34 | { |
35 | using Array = std::array<const int, 0>; |
36 | Array c = {{}}; |
37 | Array const& cc = c; |
38 | TEST_LIBCPP_ASSERT_FAILURE(c[0], "cannot call array<T, 0>::operator[] on a zero-sized array" ); |
39 | TEST_LIBCPP_ASSERT_FAILURE(c[1], "cannot call array<T, 0>::operator[] on a zero-sized array" ); |
40 | TEST_LIBCPP_ASSERT_FAILURE(cc[0], "cannot call array<T, 0>::operator[] on a zero-sized array" ); |
41 | TEST_LIBCPP_ASSERT_FAILURE(cc[1], "cannot call array<T, 0>::operator[] on a zero-sized array" ); |
42 | } |
43 | } |
44 | |
45 | // Check with non-empty arrays |
46 | { |
47 | { |
48 | using Array = std::array<int, 1>; |
49 | Array c = {}; |
50 | Array const& cc = c; |
51 | TEST_LIBCPP_ASSERT_FAILURE(c[2], "out-of-bounds access in std::array<T, N>" ); |
52 | TEST_LIBCPP_ASSERT_FAILURE(cc[2], "out-of-bounds access in std::array<T, N>" ); |
53 | } |
54 | { |
55 | using Array = std::array<const int, 1>; |
56 | Array c = {{}}; |
57 | Array const& cc = c; |
58 | TEST_LIBCPP_ASSERT_FAILURE(c[2], "out-of-bounds access in std::array<T, N>" ); |
59 | TEST_LIBCPP_ASSERT_FAILURE(cc[2], "out-of-bounds access in std::array<T, N>" ); |
60 | } |
61 | |
62 | { |
63 | using Array = std::array<int, 5>; |
64 | Array c = {}; |
65 | Array const& cc = c; |
66 | TEST_LIBCPP_ASSERT_FAILURE(c[99], "out-of-bounds access in std::array<T, N>" ); |
67 | TEST_LIBCPP_ASSERT_FAILURE(cc[99], "out-of-bounds access in std::array<T, N>" ); |
68 | } |
69 | { |
70 | using Array = std::array<const int, 5>; |
71 | Array c = {{}}; |
72 | Array const& cc = c; |
73 | TEST_LIBCPP_ASSERT_FAILURE(c[99], "out-of-bounds access in std::array<T, N>" ); |
74 | TEST_LIBCPP_ASSERT_FAILURE(cc[99], "out-of-bounds access in std::array<T, N>" ); |
75 | } |
76 | } |
77 | |
78 | return 0; |
79 | } |
80 | |