diff --git a/include/experimental/__p1684_bits/mdarray.hpp b/include/experimental/__p1684_bits/mdarray.hpp index e2c9bbaf..1e6f4883 100644 --- a/include/experimental/__p1684_bits/mdarray.hpp +++ b/include/experimental/__p1684_bits/mdarray.hpp @@ -364,6 +364,14 @@ class mdarray { static_assert( std::is_constructible::value, ""); } +#if 0 + // Corresponds to deduction guide from std::initializer_list + MDSPAN_INLINE_FUNCTION + constexpr mdarray(std::initializer_list values) + : map_(extents_type{}), ctr_{values} + {} +#endif // 0 + // Corresponds to deduction guide from C array MDSPAN_TEMPLATE_REQUIRES( class CArray, @@ -600,5 +608,23 @@ mdarray(CArray& values) -> mdarray< decltype(impl::carray_to_array(values)) >; +#if 0 +// Adding a deduction guide from initializer_list breaks the above +// C array deduction guide, because construction from +// initializer_list catches every possible creation of an mdarray +// from curly braces. +// +// We may not know values.size() at compile time, +// so we have to use a dynamically allocated container. +template +mdarray(std::initializer_list values) -> +mdarray< + std::remove_cvref_t, + dextents, + layout_right, + std::vector> +>; +#endif // 0 + } // end namespace MDSPAN_IMPL_PROPOSED_NAMESPACE } // end namespace MDSPAN_IMPL_STANDARD_NAMESPACE diff --git a/tests/test_mdarray_carray_ctad.cpp b/tests/test_mdarray_carray_ctad.cpp index e9a2d4dc..c765c320 100644 --- a/tests/test_mdarray_carray_ctad.cpp +++ b/tests/test_mdarray_carray_ctad.cpp @@ -199,3 +199,39 @@ TEST(TestMdarrayCtorDataCArray, test_mdarray_carray_ctad) { __MDSPAN_TESTS_RUN_TEST((test_mdarray_ctad_carray_rank2())) __MDSPAN_TESTS_RUN_TEST((test_mdarray_ctad_carray_rank3())) } + +#if 0 +TEST(TestMdarrayCtorInitializerList, Rank1) { + using MDSPAN_IMPL_STANDARD_NAMESPACE::dextents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::layout_right; + + auto error_buffer = allocate_error_buffer(); + { + std::size_t* errors = error_buffer.get(); + errors[0] = 0; + dispatch([errors] _MDSPAN_HOST_DEVICE () { + KokkosEx::mdarray m{{1.0f, 2.0f, 3.0f}}; + static_assert(std::is_same_v>); + static_assert(std::is_same_v); + static_assert(std::is_same_v>); + + __MDSPAN_DEVICE_ASSERT_EQ(m.rank(), 1); + __MDSPAN_DEVICE_ASSERT_EQ(m.rank_dynamic(), 1); + __MDSPAN_DEVICE_ASSERT_EQ(m.extent(0), 3); + + for (std::size_t k = 0; k < 3; ++k) { +#if defined(MDSPAN_USE_BRACKET_OPERATOR) && (MDSPAN_USE_BRACKET_OPERATOR != 0) + __MDSPAN_DEVICE_ASSERT_EQ(m[k], (static_cast(k) + 1.0f)); +#else + __MDSPAN_DEVICE_ASSERT_EQ(m(k), (static_cast(k) + 1.0f)); +#endif + } + }); + ASSERT_EQ(errors[0], 0); + } +} +#endif // 0