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 front() const; // constexpr in C++14
12*77b9abfcSLouis Dionne // const_reference back() const; // constexpr in C++14
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 C::const_reference r1 = c.front();
26*77b9abfcSLouis Dionne assert(r1 == 1);
27*77b9abfcSLouis Dionne
28*77b9abfcSLouis Dionne C::const_reference r2 = c.back();
29*77b9abfcSLouis Dionne assert(r2 == 3.5);
30*77b9abfcSLouis Dionne }
31*77b9abfcSLouis Dionne {
32*77b9abfcSLouis Dionne typedef double T;
33*77b9abfcSLouis Dionne typedef std::array<T, 0> C;
34*77b9abfcSLouis Dionne C const c = {};
35*77b9abfcSLouis Dionne ASSERT_SAME_TYPE(decltype(c.back()), C::const_reference);
36*77b9abfcSLouis Dionne LIBCPP_ASSERT_NOEXCEPT(c.back());
37*77b9abfcSLouis Dionne ASSERT_SAME_TYPE(decltype(c.front()), C::const_reference);
38*77b9abfcSLouis Dionne LIBCPP_ASSERT_NOEXCEPT(c.front());
39*77b9abfcSLouis Dionne if (c.size() > (0)) { // always false
40*77b9abfcSLouis Dionne TEST_IGNORE_NODISCARD c.front();
41*77b9abfcSLouis Dionne TEST_IGNORE_NODISCARD c.back();
42*77b9abfcSLouis Dionne }
43*77b9abfcSLouis Dionne }
44*77b9abfcSLouis Dionne {
45*77b9abfcSLouis Dionne typedef double T;
46*77b9abfcSLouis Dionne typedef std::array<const T, 0> C;
47*77b9abfcSLouis Dionne C const c = {};
48*77b9abfcSLouis Dionne ASSERT_SAME_TYPE(decltype(c.back()), C::const_reference);
49*77b9abfcSLouis Dionne LIBCPP_ASSERT_NOEXCEPT(c.back());
50*77b9abfcSLouis Dionne ASSERT_SAME_TYPE(decltype(c.front()), C::const_reference);
51*77b9abfcSLouis Dionne LIBCPP_ASSERT_NOEXCEPT(c.front());
52*77b9abfcSLouis Dionne if (c.size() > (0)) {
53*77b9abfcSLouis Dionne TEST_IGNORE_NODISCARD c.front();
54*77b9abfcSLouis Dionne TEST_IGNORE_NODISCARD c.back();
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