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