1545b8861SEric Fiselier //===----------------------------------------------------------------------===//
2545b8861SEric 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
6545b8861SEric Fiselier //
7545b8861SEric Fiselier //===----------------------------------------------------------------------===//
8545b8861SEric Fiselier
9545b8861SEric Fiselier // <array>
10545b8861SEric Fiselier
11545b8861SEric Fiselier // template <size_t I, class T, size_t N> const T&& get(const array<T, N>&& a);
12545b8861SEric Fiselier
13*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03
14545b8861SEric Fiselier
15545b8861SEric Fiselier #include <array>
16545b8861SEric Fiselier #include <memory>
17545b8861SEric Fiselier #include <type_traits>
18545b8861SEric Fiselier #include <utility>
19545b8861SEric Fiselier #include <cassert>
20545b8861SEric Fiselier
21545b8861SEric Fiselier #include "test_macros.h"
22545b8861SEric Fiselier
main(int,char **)232df59c50SJF Bastien int main(int, char**)
24545b8861SEric Fiselier {
25545b8861SEric Fiselier
26545b8861SEric Fiselier {
27545b8861SEric Fiselier typedef std::unique_ptr<double> T;
28545b8861SEric Fiselier typedef std::array<T, 1> C;
29545b8861SEric Fiselier const C c = {std::unique_ptr<double>(new double(3.5))};
30545b8861SEric Fiselier static_assert(std::is_same<const T&&, decltype(std::get<0>(std::move(c)))>::value, "");
31545b8861SEric Fiselier static_assert(noexcept(std::get<0>(std::move(c))), "");
32545b8861SEric Fiselier const T&& t = std::get<0>(std::move(c));
33545b8861SEric Fiselier assert(*t == 3.5);
34545b8861SEric Fiselier }
35545b8861SEric Fiselier
3677b9abfcSLouis Dionne #if TEST_STD_VER >= 14
37545b8861SEric Fiselier {
38545b8861SEric Fiselier typedef double T;
39545b8861SEric Fiselier typedef std::array<T, 3> C;
40545b8861SEric Fiselier constexpr const C c = {1, 2, 3.5};
41545b8861SEric Fiselier static_assert(std::get<0>(std::move(c)) == 1, "");
42545b8861SEric Fiselier static_assert(std::get<1>(std::move(c)) == 2, "");
43545b8861SEric Fiselier static_assert(std::get<2>(std::move(c)) == 3.5, "");
44545b8861SEric Fiselier }
45545b8861SEric Fiselier #endif
462df59c50SJF Bastien
472df59c50SJF Bastien return 0;
48545b8861SEric Fiselier }
49