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