80 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// REQUIRES: has-unix-headers10// UNSUPPORTED: c++0311// UNSUPPORTED: libcpp-hardening-mode=none12// XFAIL: libcpp-hardening-mode=debug && availability-verbose_abort-missing13 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 22int main(int, char**) {23 // Check with an empty array24 {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 arrays46 {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