1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <array> 10 // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 11 12 // template <typename T, size_t Size> 13 // constexpr auto to_array(T (&arr)[Size]) 14 // -> array<remove_cv_t<T>, Size>; 15 16 // template <typename T, size_t Size> 17 // constexpr auto to_array(T (&&arr)[Size]) 18 // -> array<remove_cv_t<T>, Size>; 19 20 #include <array> 21 #include <cassert> 22 23 #include "test_macros.h" 24 #include "MoveOnly.h" 25 26 int main(int, char**) { 27 // Test deduced type. 28 { 29 auto arr = std::to_array({1, 2, 3}); 30 ASSERT_SAME_TYPE(decltype(arr), std::array<int, 3>); 31 assert(arr[0] == 1); 32 assert(arr[1] == 2); 33 assert(arr[2] == 3); 34 } 35 36 { 37 const long l1 = 42; 38 auto arr = std::to_array({1L, 4L, 9L, l1}); 39 ASSERT_SAME_TYPE(decltype(arr)::value_type, long); 40 static_assert(arr.size() == 4, ""); 41 assert(arr[0] == 1); 42 assert(arr[1] == 4); 43 assert(arr[2] == 9); 44 assert(arr[3] == l1); 45 } 46 47 { 48 auto arr = std::to_array("meow"); 49 ASSERT_SAME_TYPE(decltype(arr), std::array<char, 5>); 50 assert(arr[0] == 'm'); 51 assert(arr[1] == 'e'); 52 assert(arr[2] == 'o'); 53 assert(arr[3] == 'w'); 54 assert(arr[4] == '\0'); 55 } 56 57 { 58 double source[3] = {4.0, 5.0, 6.0}; 59 auto arr = std::to_array(source); 60 ASSERT_SAME_TYPE(decltype(arr), std::array<double, 3>); 61 assert(arr[0] == 4.0); 62 assert(arr[1] == 5.0); 63 assert(arr[2] == 6.0); 64 } 65 66 { 67 double source[3] = {4.0, 5.0, 6.0}; 68 auto arr = std::to_array(std::move(source)); 69 ASSERT_SAME_TYPE(decltype(arr), std::array<double, 3>); 70 assert(arr[0] == 4.0); 71 assert(arr[1] == 5.0); 72 assert(arr[2] == 6.0); 73 } 74 75 { 76 MoveOnly source[] = {MoveOnly{0}, MoveOnly{1}, MoveOnly{2}}; 77 78 auto arr = std::to_array(std::move(source)); 79 ASSERT_SAME_TYPE(decltype(arr), std::array<MoveOnly, 3>); 80 for (int i = 0; i < 3; ++i) 81 assert(arr[i].get() == i && source[i].get() == 0); 82 } 83 84 // Test C99 compound literal. 85 { 86 auto arr = std::to_array((int[]){3, 4}); 87 ASSERT_SAME_TYPE(decltype(arr), std::array<int, 2>); 88 assert(arr[0] == 3); 89 assert(arr[1] == 4); 90 } 91 92 // Test explicit type. 93 { 94 auto arr = std::to_array<long>({1, 2, 3}); 95 ASSERT_SAME_TYPE(decltype(arr), std::array<long, 3>); 96 assert(arr[0] == 1); 97 assert(arr[1] == 2); 98 assert(arr[2] == 3); 99 } 100 101 { 102 struct A { 103 int a; 104 double b; 105 }; 106 107 auto arr = std::to_array<A>({{3, .1}}); 108 ASSERT_SAME_TYPE(decltype(arr), std::array<A, 1>); 109 assert(arr[0].a == 3); 110 assert(arr[0].b == .1); 111 } 112 113 // Test constexpr. 114 { 115 constexpr std::array<int, 3> arr = std::to_array({1, 2, 3}); 116 static_assert(arr[0] == 1); 117 static_assert(arr[1] == 2); 118 static_assert(arr[2] == 3); 119 } 120 121 return 0; 122 } 123