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