//===----------------------------------------------------------------------===// // // 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 // // // [simd.class] // simd() noexcept = default; #include "../test_utils.h" #include namespace ex = std::experimental::parallelism_v2; // See https://www.open-std.org/jtc1/sc22/WG21/docs/papers/2019/n4808.pdf // Default initialization performs no initialization of the elements; value-initialization initializes each element with T(). // Thus, default initialization leaves the elements in an indeterminate state. template struct CheckSimdDefaultCtor { template void operator()() { static_assert(std::is_nothrow_default_constructible_v>); ex::simd pure_simd; // trash value in default ctor static_assert(pure_simd.size() > 0); } }; template struct CheckSimdDefaultCopyCtor { template void operator()() { ex::simd pure_simd([](T i) { return i; }); 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] = pure_simd[i]; static_assert(std::is_nothrow_copy_constructible_v>); ex::simd from_copy_ctor(pure_simd); assert_simd_values_equal(from_copy_ctor, expected_value); } }; template struct CheckSimdDefaultMoveCtor { template void operator()() { ex::simd pure_simd([](T i) { return i; }); 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] = pure_simd[i]; static_assert(std::is_nothrow_move_constructible_v>); ex::simd from_move_ctor(std::move(pure_simd)); assert_simd_values_equal(from_move_ctor, expected_value); } }; template struct CheckSimdDefaultCopyAssignment { template void operator()() { ex::simd pure_simd([](T i) { return i; }); 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] = pure_simd[i]; static_assert(std::is_nothrow_copy_assignable_v>); ex::simd from_copy_assignment; from_copy_assignment = pure_simd; assert_simd_values_equal(from_copy_assignment, expected_value); } }; template struct CheckSimdDefaultMoveAssignment { template void operator()() { ex::simd pure_simd([](T i) { return i; }); 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] = pure_simd[i]; static_assert(std::is_nothrow_move_assignable_v>); ex::simd from_move_assignment; from_move_assignment = std::move(pure_simd); assert_simd_values_equal(from_move_assignment, expected_value); } }; int main(int, char**) { test_all_simd_abi(); test_all_simd_abi(); test_all_simd_abi(); test_all_simd_abi(); test_all_simd_abi(); return 0; }