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 
115a83710eSEric Fiselier // template <size_t I, class T, size_t N> T& get(array<T, N>& a);
125a83710eSEric Fiselier 
135a83710eSEric Fiselier #include <array>
145a83710eSEric Fiselier #include <cassert>
155a83710eSEric Fiselier 
162decfad7SEric Fiselier #include "test_macros.h"
172decfad7SEric Fiselier 
18b4e2e7a2SEric Fiselier // std::array is explicitly allowed to be initialized with A a = { init-list };.
19b4e2e7a2SEric Fiselier // Disable the missing braces warning for this reason.
20b4e2e7a2SEric Fiselier #include "disable_missing_braces_warning.h"
212decfad7SEric Fiselier 
222decfad7SEric Fiselier 
23*77b9abfcSLouis Dionne template <typename ...T>
24*77b9abfcSLouis Dionne TEST_CONSTEXPR std::array<int, sizeof...(T)> tempArray(T ...args)
25*77b9abfcSLouis Dionne {
26*77b9abfcSLouis Dionne     return {args...};
27*77b9abfcSLouis Dionne }
285a83710eSEric Fiselier 
29*77b9abfcSLouis Dionne TEST_CONSTEXPR_CXX14 bool tests()
30*77b9abfcSLouis Dionne {
31*77b9abfcSLouis Dionne     {
32*77b9abfcSLouis Dionne         std::array<double, 1> array = {3.3};
33*77b9abfcSLouis Dionne         assert(std::get<0>(array) == 3.3);
34*77b9abfcSLouis Dionne         std::get<0>(array) = 99.1;
35*77b9abfcSLouis Dionne         assert(std::get<0>(array) == 99.1);
36*77b9abfcSLouis Dionne     }
37*77b9abfcSLouis Dionne     {
38*77b9abfcSLouis Dionne         std::array<double, 2> array = {3.3, 4.4};
39*77b9abfcSLouis Dionne         assert(std::get<0>(array) == 3.3);
40*77b9abfcSLouis Dionne         assert(std::get<1>(array) == 4.4);
41*77b9abfcSLouis Dionne         std::get<0>(array) = 99.1;
42*77b9abfcSLouis Dionne         std::get<1>(array) = 99.2;
43*77b9abfcSLouis Dionne         assert(std::get<0>(array) == 99.1);
44*77b9abfcSLouis Dionne         assert(std::get<1>(array) == 99.2);
45*77b9abfcSLouis Dionne     }
46*77b9abfcSLouis Dionne     {
47*77b9abfcSLouis Dionne         std::array<double, 3> array = {3.3, 4.4, 5.5};
48*77b9abfcSLouis Dionne         assert(std::get<0>(array) == 3.3);
49*77b9abfcSLouis Dionne         assert(std::get<1>(array) == 4.4);
50*77b9abfcSLouis Dionne         assert(std::get<2>(array) == 5.5);
51*77b9abfcSLouis Dionne         std::get<1>(array) = 99.2;
52*77b9abfcSLouis Dionne         assert(std::get<0>(array) == 3.3);
53*77b9abfcSLouis Dionne         assert(std::get<1>(array) == 99.2);
54*77b9abfcSLouis Dionne         assert(std::get<2>(array) == 5.5);
55*77b9abfcSLouis Dionne     }
56*77b9abfcSLouis Dionne     {
57*77b9abfcSLouis Dionne         std::array<double, 1> array = {3.3};
58*77b9abfcSLouis Dionne         static_assert(std::is_same<double&, decltype(std::get<0>(array))>::value, "");
59*77b9abfcSLouis Dionne     }
60*77b9abfcSLouis Dionne     {
61*77b9abfcSLouis Dionne         assert(std::get<0>(tempArray(1, 2, 3)) == 1);
62*77b9abfcSLouis Dionne         assert(std::get<1>(tempArray(1, 2, 3)) == 2);
63*77b9abfcSLouis Dionne         assert(std::get<2>(tempArray(1, 2, 3)) == 3);
64*77b9abfcSLouis Dionne     }
65*77b9abfcSLouis Dionne 
66*77b9abfcSLouis Dionne     return true;
67*77b9abfcSLouis Dionne }
685a83710eSEric Fiselier 
692df59c50SJF Bastien int main(int, char**)
705a83710eSEric Fiselier {
71*77b9abfcSLouis Dionne     tests();
72*77b9abfcSLouis Dionne #if TEST_STD_VER >= 14
73*77b9abfcSLouis Dionne     static_assert(tests(), "");
745a83710eSEric Fiselier #endif
752df59c50SJF Bastien     return 0;
765a83710eSEric Fiselier }
77