//===----------------------------------------------------------------------===// // // 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, c++20 // // template // explicit extents(Integrals...) -> see below; // Constraints: (is_convertible_v && ...) is true. // // Remarks: The deduced type is dextents. // until C++26 // Remarks: The deduced type is extents...>. // since C++26 #include #include #include #include // dynamic_extent #include #include "../ConvertibleToIntegral.h" #include "test_macros.h" struct NoDefaultCtorIndex { size_t value; constexpr NoDefaultCtorIndex() = delete; constexpr NoDefaultCtorIndex(size_t val) : value(val) {} constexpr operator size_t() const noexcept { return value; } }; template constexpr void test(E e, Expected expected) { ASSERT_SAME_TYPE(E, Expected); assert(e == expected); } constexpr bool test() { constexpr std::size_t D = std::dynamic_extent; test(std::extents(), std::extents()); test(std::extents(1), std::extents(1)); test(std::extents(1, 2u), std::extents(1, 2u)); test(std::extents(1, 2u, 3, 4, 5, 6, 7, 8, 9), std::extents(1, 2u, 3, 4, 5, 6, 7, 8, 9)); test(std::extents(NoDefaultCtorIndex{1}, NoDefaultCtorIndex{2}), std::extents(1, 2)); #if _LIBCPP_STD_VER >= 26 // P3029R1: deduction from `integral_constant` test(std::extents(std::integral_constant{}), std::extents()); test(std::extents(std::integral_constant{}, 6), std::extents(6)); test(std::extents(std::integral_constant{}, 6, std::integral_constant{}), std::extents(6)); #endif return true; } int main(int, char**) { test(); static_assert(test()); return 0; }