//===----------------------------------------------------------------------===// // // 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 // constexpr explicit(!is_convertible_v) // mapping(const mapping&) noexcept; // Constraints: is_constructible_v is true. // // Preconditions: other.required_span_size() is representable as a value of type index_type #include #include #include #include #include // dynamic_extent #include #include "test_macros.h" template constexpr void test_implicit_conversion(To dest, From src) { assert(dest == src); } template constexpr void test_conversion(FromE src_exts) { using To = std::layout_right::mapping; using From = std::layout_right::mapping; From src(src_exts); ASSERT_NOEXCEPT(To(src)); To dest(src); assert(dest == src); if constexpr (implicit) { dest = src; assert(dest == src); test_implicit_conversion(src, src); } } template constexpr void test_conversion() { constexpr size_t D = std::dynamic_extent; constexpr bool idx_convertible = static_cast(std::numeric_limits::max()) >= static_cast(std::numeric_limits::max()); // clang-format off test_conversion>(std::extents()); test_conversion>(std::extents(5)); test_conversion>(std::extents(5)); test_conversion>(std::extents()); test_conversion>(std::extents(5, 5)); test_conversion>(std::extents(5, 5)); test_conversion>(std::extents(5)); test_conversion>(std::extents()); test_conversion>(std::extents(5, 7)); test_conversion>( std::extents(5, 7, 8, 9, 1)); test_conversion>(std::extents(5)); test_conversion>(std::extents()); // clang-format on } template using mapping_t = std::layout_right::mapping>; constexpr void test_no_implicit_conversion() { constexpr size_t D = std::dynamic_extent; // Sanity check that one static to dynamic conversion works static_assert(std::is_constructible_v, mapping_t>); static_assert(std::is_convertible_v, mapping_t>); // Check that dynamic to static conversion only works explicitly static_assert(std::is_constructible_v, mapping_t>); static_assert(!std::is_convertible_v, mapping_t>); // Sanity check that one static to dynamic conversion works static_assert(std::is_constructible_v, mapping_t>); static_assert(std::is_convertible_v, mapping_t>); // Check that dynamic to static conversion only works explicitly static_assert(std::is_constructible_v, mapping_t>); static_assert(!std::is_convertible_v, mapping_t>); // Sanity check that smaller index_type to larger index_type conversion works static_assert(std::is_constructible_v, mapping_t>); static_assert(std::is_convertible_v, mapping_t>); // Check that larger index_type to smaller index_type conversion works explicitly only static_assert(std::is_constructible_v, mapping_t>); static_assert(!std::is_convertible_v, mapping_t>); } constexpr void test_rank_mismatch() { constexpr size_t D = std::dynamic_extent; static_assert(!std::is_constructible_v, mapping_t>); static_assert(!std::is_constructible_v, mapping_t>); static_assert(!std::is_constructible_v, mapping_t>); static_assert(!std::is_constructible_v, mapping_t>); } constexpr void test_static_extent_mismatch() { constexpr size_t D = std::dynamic_extent; static_assert(!std::is_constructible_v, mapping_t>); static_assert(!std::is_constructible_v, mapping_t>); static_assert(!std::is_constructible_v, mapping_t>); } constexpr bool test() { test_conversion(); test_conversion(); test_conversion(); test_conversion(); test_no_implicit_conversion(); test_rank_mismatch(); test_static_extent_mismatch(); return true; } int main(int, char**) { test(); static_assert(test()); return 0; }