xref: /llvm-project/libcxx/test/std/containers/sequences/array/indexing.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 
11*77b9abfcSLouis Dionne // reference operator[](size_type); // constexpr in C++17
12*77b9abfcSLouis Dionne // Libc++ marks it as noexcept
135a83710eSEric Fiselier 
145a83710eSEric Fiselier #include <array>
155a83710eSEric Fiselier #include <cassert>
165a83710eSEric Fiselier 
172decfad7SEric Fiselier #include "test_macros.h"
182decfad7SEric Fiselier 
tests()19*77b9abfcSLouis Dionne TEST_CONSTEXPR_CXX17 bool tests()
205a83710eSEric Fiselier {
215a83710eSEric Fiselier     {
225a83710eSEric Fiselier         typedef double T;
235a83710eSEric Fiselier         typedef std::array<T, 3> C;
245a83710eSEric Fiselier         C c = {1, 2, 3.5};
255f6a5ac1SMarshall Clow         LIBCPP_ASSERT_NOEXCEPT(c[0]);
265f6a5ac1SMarshall Clow         ASSERT_SAME_TYPE(C::reference, decltype(c[0]));
275a83710eSEric Fiselier         C::reference r1 = c[0];
285a83710eSEric Fiselier         assert(r1 == 1);
295a83710eSEric Fiselier         r1 = 5.5;
305a83710eSEric Fiselier         assert(c.front() == 5.5);
315a83710eSEric Fiselier 
325a83710eSEric Fiselier         C::reference r2 = c[2];
335a83710eSEric Fiselier         assert(r2 == 3.5);
345a83710eSEric Fiselier         r2 = 7.5;
355a83710eSEric Fiselier         assert(c.back() == 7.5);
365a83710eSEric Fiselier     }
37*77b9abfcSLouis Dionne 
38*77b9abfcSLouis Dionne     // Test operator[] "works" on zero sized arrays
395a83710eSEric Fiselier     {
40*77b9abfcSLouis Dionne         {
4159cdf90aSEric Fiselier             typedef double T;
4259cdf90aSEric Fiselier             typedef std::array<T, 0> C;
4359cdf90aSEric Fiselier             C c = {};
442fa901c4SMarshall Clow             LIBCPP_ASSERT_NOEXCEPT(c[0]);
452fa901c4SMarshall Clow             ASSERT_SAME_TYPE(C::reference, decltype(c[0]));
4659cdf90aSEric Fiselier             if (c.size() > (0)) { // always false
47*77b9abfcSLouis Dionne               C::reference r = c[0];
48*77b9abfcSLouis Dionne               (void)r;
4959cdf90aSEric Fiselier             }
5059cdf90aSEric Fiselier         }
51*77b9abfcSLouis Dionne         {
5259cdf90aSEric Fiselier             typedef double T;
5359cdf90aSEric Fiselier             typedef std::array<const T, 0> C;
54*77b9abfcSLouis Dionne             C c = {};
552fa901c4SMarshall Clow             LIBCPP_ASSERT_NOEXCEPT(c[0]);
562fa901c4SMarshall Clow             ASSERT_SAME_TYPE(C::reference, decltype(c[0]));
5759cdf90aSEric Fiselier             if (c.size() > (0)) { // always false
58*77b9abfcSLouis Dionne               C::reference r = c[0];
59*77b9abfcSLouis Dionne               (void)r;
6059cdf90aSEric Fiselier             }
6159cdf90aSEric Fiselier         }
62*77b9abfcSLouis Dionne     }
63*77b9abfcSLouis Dionne 
64*77b9abfcSLouis Dionne     return true;
65*77b9abfcSLouis Dionne }
66*77b9abfcSLouis Dionne 
main(int,char **)67*77b9abfcSLouis Dionne int main(int, char**)
685a83710eSEric Fiselier {
69*77b9abfcSLouis Dionne     tests();
70*77b9abfcSLouis Dionne #if TEST_STD_VER >= 17
71*77b9abfcSLouis Dionne     static_assert(tests(), "");
725a83710eSEric Fiselier #endif
732df59c50SJF Bastien     return 0;
745a83710eSEric Fiselier }
75