1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <array>
11
12// reference operator[] (size_type)
13// const_reference operator[] (size_type); // constexpr in C++14
14// reference at (size_type)
15// const_reference at (size_type); // constexpr in C++14
16
17#include <array>
18#include <cassert>
19
20int main()
21{
22    {
23        typedef double T;
24        typedef std::array<T, 3> C;
25        C c = {1, 2, 3.5};
26        C::reference r1 = c.at(0);
27        assert(r1 == 1);
28        r1 = 5.5;
29        assert(c.front() == 5.5);
30
31        C::reference r2 = c.at(2);
32        assert(r2 == 3.5);
33        r2 = 7.5;
34        assert(c.back() == 7.5);
35
36        try { (void) c.at(3); }
37        catch (const std::out_of_range &) {}
38    }
39    {
40        typedef double T;
41        typedef std::array<T, 3> C;
42        const C c = {1, 2, 3.5};
43        C::const_reference r1 = c.at(0);
44        assert(r1 == 1);
45
46        C::const_reference r2 = c.at(2);
47        assert(r2 == 3.5);
48
49        try { (void) c.at(3); }
50        catch (const std::out_of_range &) {}
51    }
52
53#if _LIBCPP_STD_VER > 11
54    {
55        typedef double T;
56        typedef std::array<T, 3> C;
57        constexpr C c = {1, 2, 3.5};
58
59        constexpr T t1 = c.at(0);
60        static_assert (t1 == 1, "");
61
62        constexpr T t2 = c.at(2);
63        static_assert (t2 == 3.5, "");
64    }
65#endif
66
67}
68