// Copyright (C) 2020-2022 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . // expensive: * [1-9] * * #include "bits/verify.h" #include "bits/metahelpers.h" enum unscoped_enum { foo }; enum class scoped_enum { bar }; struct convertible { operator int(); operator float(); }; template void test() { using T = typename V::value_type; VERIFY(std::experimental::is_simd_v); VERIFY(std::experimental::is_abi_tag_v); { V x; // not initialized x = V{}; // default broadcasts 0 COMPARE(x, V(0)); COMPARE(x, V()); COMPARE(x, V{}); x = V(); // default broadcasts 0 COMPARE(x, V(0)); COMPARE(x, V()); COMPARE(x, V{}); x = 0; COMPARE(x, V(0)); COMPARE(x, V()); COMPARE(x, V{}); for (std::size_t i = 0; i < V::size(); ++i) { COMPARE(T(x[i]), T(0)) << "i = " << i; COMPARE(x[i], T(0)) << "i = " << i; } } V x = 3; V y = T(0); for (std::size_t i = 0; i < V::size(); ++i) { COMPARE(x[i], T(3)) << "i = " << i; COMPARE(y[i], T(0)) << "i = " << i; } y = 3; COMPARE(x, y); VERIFY(!(is_substitution_failure) ); VERIFY((is_substitution_failure) ); COMPARE((is_substitution_failure), (!std::is_convertible::value)); COMPARE((is_substitution_failure), (sizeof(long double) > sizeof(T) || std::is_integral::value)); COMPARE((is_substitution_failure), (sizeof(double) > sizeof(T) || std::is_integral::value)); COMPARE((is_substitution_failure), (sizeof(float) > sizeof(T) || std::is_integral::value)); COMPARE((is_substitution_failure), (has_less_bits() || std::is_unsigned::value)); COMPARE((is_substitution_failure), (has_less_bits())); COMPARE((is_substitution_failure), (has_less_bits() || std::is_unsigned::value)); COMPARE((is_substitution_failure), (has_less_bits())); // int broadcast *always* works: VERIFY(!(is_substitution_failure) ); // uint broadcast works for any unsigned T: COMPARE((is_substitution_failure), (!std::is_unsigned::value && has_less_bits())); COMPARE((is_substitution_failure), (has_less_bits() || std::is_unsigned::value)); COMPARE((is_substitution_failure), (has_less_bits())); COMPARE((is_substitution_failure), (has_less_bits() || std::is_unsigned::value)); COMPARE((is_substitution_failure), (has_less_bits())); }