//===----------------------------------------------------------------------===// // // 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 // XFAIL: target=powerpc{{.*}}le-unknown-linux-gnu // // // [simd.class] // template simd(const simd>&) noexcept; #include "../test_utils.h" #include namespace ex = std::experimental::parallelism_v2; template struct ConversionHelper { const std::array& expected_value; ConversionHelper(const std::array& value) : expected_value(value) {} template void operator()() const { if constexpr (!std::is_same_v && std::is_same_v> && is_non_narrowing_convertible_v) { static_assert(noexcept(ex::simd(ex::simd{}))); ex::simd origin_simd([](U i) { return i; }); ex::simd simd_from_implicit_conversion(origin_simd); assert_simd_values_equal(simd_from_implicit_conversion, expected_value); } } }; template struct CheckConversionSimdCtor { template void operator()() { constexpr std::size_t array_size = ex::simd_size_v; std::array expected_value; for (size_t i = 0; i < array_size; ++i) expected_value[i] = static_cast(i); types::for_each(simd_test_types(), ConversionHelper(expected_value)); } }; template struct CheckConversionSimdCtorTraitsHelper { template void operator()() { if constexpr (!std::is_same_v) { if constexpr (std::is_same_v> && is_non_narrowing_convertible_v) static_assert(std::is_convertible_v, ex::simd>); else static_assert(!std::is_convertible_v, ex::simd>); } } }; template struct CheckConversionSimdCtorTraits { template void operator()() { constexpr std::size_t array_size = ex::simd_size_v; types::for_each(simd_test_types(), CheckConversionSimdCtorTraitsHelper()); } }; int main(int, char**) { test_all_simd_abi(); test_all_simd_abi(); return 0; }