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 
232decfad7SEric Fiselier #if TEST_STD_VER > 11
245a83710eSEric Fiselier struct S {
255a83710eSEric Fiselier    std::array<int, 3> a;
265a83710eSEric Fiselier    int k;
275a83710eSEric Fiselier    constexpr S() : a{1,2,3}, k(std::get<2>(a)) {}
285a83710eSEric Fiselier };
295a83710eSEric Fiselier 
305a83710eSEric Fiselier constexpr std::array<int, 2> getArr () { return { 3, 4 }; }
315a83710eSEric Fiselier #endif
325a83710eSEric Fiselier 
33*2df59c50SJF Bastien int main(int, char**)
345a83710eSEric Fiselier {
355a83710eSEric Fiselier     {
365a83710eSEric Fiselier         typedef double T;
375a83710eSEric Fiselier         typedef std::array<T, 3> C;
385a83710eSEric Fiselier         C c = {1, 2, 3.5};
395a83710eSEric Fiselier         std::get<1>(c) = 5.5;
405a83710eSEric Fiselier         assert(c[0] == 1);
415a83710eSEric Fiselier         assert(c[1] == 5.5);
425a83710eSEric Fiselier         assert(c[2] == 3.5);
435a83710eSEric Fiselier     }
442decfad7SEric Fiselier #if TEST_STD_VER > 11
455a83710eSEric Fiselier     {
465a83710eSEric Fiselier         typedef double T;
475a83710eSEric Fiselier         typedef std::array<T, 3> C;
485a83710eSEric Fiselier         constexpr C c = {1, 2, 3.5};
495a83710eSEric Fiselier         static_assert(std::get<0>(c) == 1, "");
505a83710eSEric Fiselier         static_assert(std::get<1>(c) == 2, "");
515a83710eSEric Fiselier         static_assert(std::get<2>(c) == 3.5, "");
525a83710eSEric Fiselier     }
535a83710eSEric Fiselier     {
545a83710eSEric Fiselier         static_assert(S().k == 3, "");
555a83710eSEric Fiselier         static_assert(std::get<1>(getArr()) == 4, "");
565a83710eSEric Fiselier     }
575a83710eSEric Fiselier #endif
58*2df59c50SJF Bastien 
59*2df59c50SJF Bastien   return 0;
605a83710eSEric Fiselier }
61