xref: /llvm-project/libcxx/test/std/containers/sequences/array/at.pass.cpp (revision 9fb3669429a8bc59622c26ab6f5cf6926ee97e7d)
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