15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <array>
105a83710eSEric Fiselier
1177b9abfcSLouis Dionne // reference at (size_type); // constexpr in C++17
125a83710eSEric Fiselier
135a83710eSEric Fiselier #include <array>
145a83710eSEric Fiselier #include <cassert>
155a83710eSEric Fiselier
165688f168SStephan T. Lavavej #ifndef TEST_HAS_NO_EXCEPTIONS
175688f168SStephan T. Lavavej #include <stdexcept>
185688f168SStephan T. Lavavej #endif
195688f168SStephan T. Lavavej
202decfad7SEric Fiselier #include "test_macros.h"
212decfad7SEric Fiselier
tests()2277b9abfcSLouis Dionne TEST_CONSTEXPR_CXX17 bool tests()
235a83710eSEric Fiselier {
245a83710eSEric Fiselier {
255a83710eSEric Fiselier typedef double T;
265a83710eSEric Fiselier typedef std::array<T, 3> C;
275a83710eSEric Fiselier C c = {1, 2, 3.5};
2877b9abfcSLouis Dionne typename C::reference r1 = c.at(0);
295a83710eSEric Fiselier assert(r1 == 1);
305a83710eSEric Fiselier r1 = 5.5;
3177b9abfcSLouis Dionne assert(c[0] == 5.5);
325a83710eSEric Fiselier
3377b9abfcSLouis Dionne typename C::reference r2 = c.at(2);
345a83710eSEric Fiselier assert(r2 == 3.5);
355a83710eSEric Fiselier r2 = 7.5;
3677b9abfcSLouis Dionne assert(c[2] == 7.5);
3777b9abfcSLouis Dionne }
3877b9abfcSLouis Dionne return true;
3977b9abfcSLouis Dionne }
405a83710eSEric Fiselier
test_exceptions()4177b9abfcSLouis Dionne void test_exceptions()
4286663cd0SRoger Ferrer Ibanez {
4359cdf90aSEric Fiselier #ifndef TEST_HAS_NO_EXCEPTIONS
4459cdf90aSEric Fiselier {
4577b9abfcSLouis Dionne std::array<int, 4> array = {1, 2, 3, 4};
4677b9abfcSLouis Dionne
4777b9abfcSLouis Dionne try {
4877b9abfcSLouis Dionne TEST_IGNORE_NODISCARD array.at(4);
4977b9abfcSLouis Dionne assert(false);
5077b9abfcSLouis Dionne } catch (std::out_of_range const&) {
5177b9abfcSLouis Dionne // pass
5277b9abfcSLouis Dionne } catch (...) {
5359cdf90aSEric Fiselier assert(false);
5459cdf90aSEric Fiselier }
5577b9abfcSLouis Dionne
5677b9abfcSLouis Dionne try {
5777b9abfcSLouis Dionne TEST_IGNORE_NODISCARD array.at(5);
5877b9abfcSLouis Dionne assert(false);
5977b9abfcSLouis Dionne } catch (std::out_of_range const&) {
6077b9abfcSLouis Dionne // pass
6177b9abfcSLouis Dionne } catch (...) {
6259cdf90aSEric Fiselier assert(false);
6359cdf90aSEric Fiselier }
645a83710eSEric Fiselier
6577b9abfcSLouis Dionne try {
6677b9abfcSLouis Dionne TEST_IGNORE_NODISCARD array.at(6);
6777b9abfcSLouis Dionne assert(false);
6877b9abfcSLouis Dionne } catch (std::out_of_range const&) {
6977b9abfcSLouis Dionne // pass
7077b9abfcSLouis Dionne } catch (...) {
7186663cd0SRoger Ferrer Ibanez assert(false);
7286663cd0SRoger Ferrer Ibanez }
7377b9abfcSLouis Dionne
7477b9abfcSLouis Dionne try {
75*8b828e98SCasey Carter using size_type = decltype(array)::size_type;
76*8b828e98SCasey Carter TEST_IGNORE_NODISCARD array.at(static_cast<size_type>(-1));
7777b9abfcSLouis Dionne assert(false);
7877b9abfcSLouis Dionne } catch (std::out_of_range const&) {
7977b9abfcSLouis Dionne // pass
8077b9abfcSLouis Dionne } catch (...) {
8177b9abfcSLouis Dionne assert(false);
8277b9abfcSLouis Dionne }
835a83710eSEric Fiselier }
845a83710eSEric Fiselier
855a83710eSEric Fiselier {
8677b9abfcSLouis Dionne std::array<int, 0> array = {};
875a83710eSEric Fiselier
8877b9abfcSLouis Dionne try {
8977b9abfcSLouis Dionne TEST_IGNORE_NODISCARD array.at(0);
9077b9abfcSLouis Dionne assert(false);
9177b9abfcSLouis Dionne } catch (std::out_of_range const&) {
9277b9abfcSLouis Dionne // pass
9377b9abfcSLouis Dionne } catch (...) {
9477b9abfcSLouis Dionne assert(false);
9577b9abfcSLouis Dionne }
965a83710eSEric Fiselier }
975a83710eSEric Fiselier #endif
9877b9abfcSLouis Dionne }
995a83710eSEric Fiselier
main(int,char **)10077b9abfcSLouis Dionne int main(int, char**)
101e7826950SMarshall Clow {
10277b9abfcSLouis Dionne tests();
10377b9abfcSLouis Dionne test_exceptions();
1042df59c50SJF Bastien
10577b9abfcSLouis Dionne #if TEST_STD_VER >= 17
10677b9abfcSLouis Dionne static_assert(tests(), "");
10777b9abfcSLouis Dionne #endif
1082df59c50SJF Bastien return 0;
1095a83710eSEric Fiselier }
110