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