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