177b9abfcSLouis Dionne //===----------------------------------------------------------------------===//
277b9abfcSLouis Dionne //
377b9abfcSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
477b9abfcSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
577b9abfcSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
677b9abfcSLouis Dionne //
777b9abfcSLouis Dionne //===----------------------------------------------------------------------===//
877b9abfcSLouis Dionne
977b9abfcSLouis Dionne // <array>
1077b9abfcSLouis Dionne
1177b9abfcSLouis Dionne // const_reference at (size_type) const; // constexpr in C++14
1277b9abfcSLouis Dionne
1377b9abfcSLouis Dionne #include <array>
1477b9abfcSLouis Dionne #include <cassert>
1577b9abfcSLouis Dionne
1677b9abfcSLouis Dionne #ifndef TEST_HAS_NO_EXCEPTIONS
1777b9abfcSLouis Dionne #include <stdexcept>
1877b9abfcSLouis Dionne #endif
1977b9abfcSLouis Dionne
2077b9abfcSLouis Dionne #include "test_macros.h"
2177b9abfcSLouis Dionne
tests()2277b9abfcSLouis Dionne TEST_CONSTEXPR_CXX14 bool tests()
2377b9abfcSLouis Dionne {
2477b9abfcSLouis Dionne {
2577b9abfcSLouis Dionne typedef double T;
2677b9abfcSLouis Dionne typedef std::array<T, 3> C;
2777b9abfcSLouis Dionne C const c = {1, 2, 3.5};
2877b9abfcSLouis Dionne typename C::const_reference r1 = c.at(0);
2977b9abfcSLouis Dionne assert(r1 == 1);
3077b9abfcSLouis Dionne
3177b9abfcSLouis Dionne typename C::const_reference r2 = c.at(2);
3277b9abfcSLouis Dionne assert(r2 == 3.5);
3377b9abfcSLouis Dionne }
3477b9abfcSLouis Dionne return true;
3577b9abfcSLouis Dionne }
3677b9abfcSLouis Dionne
test_exceptions()3777b9abfcSLouis Dionne void test_exceptions()
3877b9abfcSLouis Dionne {
3977b9abfcSLouis Dionne #ifndef TEST_HAS_NO_EXCEPTIONS
4077b9abfcSLouis Dionne {
4177b9abfcSLouis Dionne std::array<int, 4> const array = {1, 2, 3, 4};
4277b9abfcSLouis Dionne
4377b9abfcSLouis Dionne try {
4477b9abfcSLouis Dionne TEST_IGNORE_NODISCARD array.at(4);
4577b9abfcSLouis Dionne assert(false);
4677b9abfcSLouis Dionne } catch (std::out_of_range const&) {
4777b9abfcSLouis Dionne // pass
4877b9abfcSLouis Dionne } catch (...) {
4977b9abfcSLouis Dionne assert(false);
5077b9abfcSLouis Dionne }
5177b9abfcSLouis Dionne
5277b9abfcSLouis Dionne try {
5377b9abfcSLouis Dionne TEST_IGNORE_NODISCARD array.at(5);
5477b9abfcSLouis Dionne assert(false);
5577b9abfcSLouis Dionne } catch (std::out_of_range const&) {
5677b9abfcSLouis Dionne // pass
5777b9abfcSLouis Dionne } catch (...) {
5877b9abfcSLouis Dionne assert(false);
5977b9abfcSLouis Dionne }
6077b9abfcSLouis Dionne
6177b9abfcSLouis Dionne try {
6277b9abfcSLouis Dionne TEST_IGNORE_NODISCARD array.at(6);
6377b9abfcSLouis Dionne assert(false);
6477b9abfcSLouis Dionne } catch (std::out_of_range const&) {
6577b9abfcSLouis Dionne // pass
6677b9abfcSLouis Dionne } catch (...) {
6777b9abfcSLouis Dionne assert(false);
6877b9abfcSLouis Dionne }
6977b9abfcSLouis Dionne
7077b9abfcSLouis Dionne try {
71*8b828e98SCasey Carter using size_type = decltype(array)::size_type;
72*8b828e98SCasey Carter TEST_IGNORE_NODISCARD array.at(static_cast<size_type>(-1));
7377b9abfcSLouis Dionne assert(false);
7477b9abfcSLouis Dionne } catch (std::out_of_range const&) {
7577b9abfcSLouis Dionne // pass
7677b9abfcSLouis Dionne } catch (...) {
7777b9abfcSLouis Dionne assert(false);
7877b9abfcSLouis Dionne }
7977b9abfcSLouis Dionne }
8077b9abfcSLouis Dionne
8177b9abfcSLouis Dionne {
8277b9abfcSLouis Dionne std::array<int, 0> array = {};
8377b9abfcSLouis Dionne
8477b9abfcSLouis Dionne try {
8577b9abfcSLouis Dionne TEST_IGNORE_NODISCARD array.at(0);
8677b9abfcSLouis Dionne assert(false);
8777b9abfcSLouis Dionne } catch (std::out_of_range const&) {
8877b9abfcSLouis Dionne // pass
8977b9abfcSLouis Dionne } catch (...) {
9077b9abfcSLouis Dionne assert(false);
9177b9abfcSLouis Dionne }
9277b9abfcSLouis Dionne }
9377b9abfcSLouis Dionne #endif
9477b9abfcSLouis Dionne }
9577b9abfcSLouis Dionne
main(int,char **)9677b9abfcSLouis Dionne int main(int, char**)
9777b9abfcSLouis Dionne {
9877b9abfcSLouis Dionne tests();
9977b9abfcSLouis Dionne test_exceptions();
10077b9abfcSLouis Dionne
10177b9abfcSLouis Dionne #if TEST_STD_VER >= 14
10277b9abfcSLouis Dionne static_assert(tests(), "");
10377b9abfcSLouis Dionne #endif
10477b9abfcSLouis Dionne return 0;
10577b9abfcSLouis Dionne }
106