// { dg-options "-std=gnu++17" } // { dg-do compile { target c++17 } } // { dg-require-cmath "" } #include namespace stdx = std::experimental; template void test01() { constexpr T data[V::size()] = {}; constexpr auto a = V(data, stdx::element_aligned); constexpr auto b = []() constexpr { V x = T(1); where(x > T(), x) = T(); where(x < T(), x) += T(); where(x >= T(), x) -= T(); where(x <= T(), x) *= T(); where(x == T(), x) /= T(1); where(x != T(), x) += T(1); return x; }(); constexpr T c = V()[0]; constexpr auto d = !V() && !!V() || !V() & !V() | !V() ^ !V(); constexpr auto e = []() constexpr { T data[V::size()] = {}; V(T(1)).copy_to(data, stdx::element_aligned); V x = T(); x[0] = T(1); x.copy_from(data, stdx::element_aligned); bool mask[V::size()] = {}; auto k = hmin(x + x - x * x) == x / x; k.copy_to(mask, stdx::element_aligned); mask[0] = false; using M = typename V::mask_type; return M(mask, stdx::element_aligned); }(); static_assert(not e[0]); static_assert(popcount(e) == V::size() - 1); static_assert(all_of(V(T(1)) == []() constexpr { float data[V::size()] = {}; V(T(1)).copy_to(data, stdx::element_aligned); V x = T(); x.copy_from(data, stdx::element_aligned); return x; }())); static_assert(hmin(V()) == T()); static_assert(hmax(V()) == T()); static_assert(reduce(V(1)) == T(V::size())); } template void iterate_abis() { test01>(); test01>(); test01>(); test01>(); test01 - 4>>(); } int main() { iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); iterate_abis(); }