1*77b9abfcSLouis Dionne //===----------------------------------------------------------------------===//
2*77b9abfcSLouis Dionne //
3*77b9abfcSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*77b9abfcSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*77b9abfcSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*77b9abfcSLouis Dionne //
7*77b9abfcSLouis Dionne //===----------------------------------------------------------------------===//
8*77b9abfcSLouis Dionne
9*77b9abfcSLouis Dionne // <array>
10*77b9abfcSLouis Dionne
11*77b9abfcSLouis Dionne // const_reference operator[](size_type) const; // constexpr in C++14
12*77b9abfcSLouis Dionne // Libc++ marks it as noexcept
13*77b9abfcSLouis Dionne
14*77b9abfcSLouis Dionne #include <array>
15*77b9abfcSLouis Dionne #include <cassert>
16*77b9abfcSLouis Dionne
17*77b9abfcSLouis Dionne #include "test_macros.h"
18*77b9abfcSLouis Dionne
tests()19*77b9abfcSLouis Dionne TEST_CONSTEXPR_CXX14 bool tests()
20*77b9abfcSLouis Dionne {
21*77b9abfcSLouis Dionne {
22*77b9abfcSLouis Dionne typedef double T;
23*77b9abfcSLouis Dionne typedef std::array<T, 3> C;
24*77b9abfcSLouis Dionne C const c = {1, 2, 3.5};
25*77b9abfcSLouis Dionne LIBCPP_ASSERT_NOEXCEPT(c[0]);
26*77b9abfcSLouis Dionne ASSERT_SAME_TYPE(C::const_reference, decltype(c[0]));
27*77b9abfcSLouis Dionne C::const_reference r1 = c[0];
28*77b9abfcSLouis Dionne assert(r1 == 1);
29*77b9abfcSLouis Dionne C::const_reference r2 = c[2];
30*77b9abfcSLouis Dionne assert(r2 == 3.5);
31*77b9abfcSLouis Dionne }
32*77b9abfcSLouis Dionne // Test operator[] "works" on zero sized arrays
33*77b9abfcSLouis Dionne {
34*77b9abfcSLouis Dionne {
35*77b9abfcSLouis Dionne typedef double T;
36*77b9abfcSLouis Dionne typedef std::array<T, 0> C;
37*77b9abfcSLouis Dionne C const c = {};
38*77b9abfcSLouis Dionne LIBCPP_ASSERT_NOEXCEPT(c[0]);
39*77b9abfcSLouis Dionne ASSERT_SAME_TYPE(C::const_reference, decltype(c[0]));
40*77b9abfcSLouis Dionne if (c.size() > (0)) { // always false
41*77b9abfcSLouis Dionne C::const_reference r = c[0];
42*77b9abfcSLouis Dionne (void)r;
43*77b9abfcSLouis Dionne }
44*77b9abfcSLouis Dionne }
45*77b9abfcSLouis Dionne {
46*77b9abfcSLouis Dionne typedef double T;
47*77b9abfcSLouis Dionne typedef std::array<T const, 0> C;
48*77b9abfcSLouis Dionne C const c = {};
49*77b9abfcSLouis Dionne LIBCPP_ASSERT_NOEXCEPT(c[0]);
50*77b9abfcSLouis Dionne ASSERT_SAME_TYPE(C::const_reference, decltype(c[0]));
51*77b9abfcSLouis Dionne if (c.size() > (0)) { // always false
52*77b9abfcSLouis Dionne C::const_reference r = c[0];
53*77b9abfcSLouis Dionne (void)r;
54*77b9abfcSLouis Dionne }
55*77b9abfcSLouis Dionne }
56*77b9abfcSLouis Dionne }
57*77b9abfcSLouis Dionne
58*77b9abfcSLouis Dionne return true;
59*77b9abfcSLouis Dionne }
60*77b9abfcSLouis Dionne
main(int,char **)61*77b9abfcSLouis Dionne int main(int, char**)
62*77b9abfcSLouis Dionne {
63*77b9abfcSLouis Dionne tests();
64*77b9abfcSLouis Dionne #if TEST_STD_VER >= 14
65*77b9abfcSLouis Dionne static_assert(tests(), "");
66*77b9abfcSLouis Dionne #endif
67*77b9abfcSLouis Dionne return 0;
68*77b9abfcSLouis Dionne }
69