//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // UNSUPPORTED: c++03, c++11, c++14, c++17 // template // constexpr auto to_array(T (&arr)[Size]) // -> array, Size>; // template // constexpr auto to_array(T (&&arr)[Size]) // -> array, Size>; #include #include #include "test_macros.h" #include "MoveOnly.h" constexpr bool tests() { // Test deduced type. { auto arr = std::to_array({1, 2, 3}); ASSERT_SAME_TYPE(decltype(arr), std::array); assert(arr[0] == 1); assert(arr[1] == 2); assert(arr[2] == 3); } { const long l1 = 42; auto arr = std::to_array({1L, 4L, 9L, l1}); ASSERT_SAME_TYPE(decltype(arr)::value_type, long); static_assert(arr.size() == 4, ""); assert(arr[0] == 1); assert(arr[1] == 4); assert(arr[2] == 9); assert(arr[3] == l1); } { auto arr = std::to_array("meow"); ASSERT_SAME_TYPE(decltype(arr), std::array); assert(arr[0] == 'm'); assert(arr[1] == 'e'); assert(arr[2] == 'o'); assert(arr[3] == 'w'); assert(arr[4] == '\0'); } { double source[3] = {4.0, 5.0, 6.0}; auto arr = std::to_array(source); ASSERT_SAME_TYPE(decltype(arr), std::array); assert(arr[0] == 4.0); assert(arr[1] == 5.0); assert(arr[2] == 6.0); } { double source[3] = {4.0, 5.0, 6.0}; auto arr = std::to_array(std::move(source)); ASSERT_SAME_TYPE(decltype(arr), std::array); assert(arr[0] == 4.0); assert(arr[1] == 5.0); assert(arr[2] == 6.0); } { MoveOnly source[] = {MoveOnly{0}, MoveOnly{1}, MoveOnly{2}}; auto arr = std::to_array(std::move(source)); ASSERT_SAME_TYPE(decltype(arr), std::array); for (int i = 0; i < 3; ++i) assert(arr[i].get() == i && source[i].get() == 0); } #ifndef _MSVC_STL_VERSION // Test C99 compound literal. { auto arr = std::to_array((int[]){3, 4}); ASSERT_SAME_TYPE(decltype(arr), std::array); assert(arr[0] == 3); assert(arr[1] == 4); } #endif // ! _MSVC_STL_VERSION // Test explicit type. { auto arr = std::to_array({1, 2, 3}); ASSERT_SAME_TYPE(decltype(arr), std::array); assert(arr[0] == 1); assert(arr[1] == 2); assert(arr[2] == 3); } { struct A { int a; double b; }; auto arr = std::to_array({{3, .1}}); ASSERT_SAME_TYPE(decltype(arr), std::array); assert(arr[0].a == 3); assert(arr[0].b == .1); } return true; } int main(int, char**) { tests(); static_assert(tests(), ""); return 0; }