This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.
simd::unchecked_scatter_to is underconstrainedSection: 29.10.8.11 [simd.permute.memory] Status: New Submitter: Hewill Kang Opened: 2025-09-29 Last modified: 2025-10-22
Priority: 2
View all issues with New status.
Discussion:
Both simd::unchecked_scatter_to and simd::partial_scatter_to are used to write a
simd::vec into a range R.
R to be contiguous_range and sized_range.
Requiring R to be output_range is also necessary; otherwise, the
constant_range cannot be written.
[2025-10-22; Reflector poll.]
Set priority to 2 after reflector poll.
This issue is related to LWG 4420(i).
The Constrains needs to be updated to handle conversions between float
and float16_t and similar cases.
Proposed resolution:
This wording is relative to N5014.
Modify 29.10.3 [simd.syn] as indicated:
namespace std::simd {
[…]
template<simd-vec-type V, ranges::contiguous_range R, simd-integral I, class... Flags>
requires ranges::sized_range<R> && ranges::output_range<R, typename V::value_type>
constexpr void
unchecked_scatter_to(const V& v, R&& out,
const I& indices, flags<Flags...> f = {});
template<simd-vec-type V, ranges::contiguous_range R, simd-integral I, class... Flags>
requires ranges::sized_range<R> && ranges::output_range<R, typename V::value_type>
constexpr void
unchecked_scatter_to(const V& v, R&& out, const typename I::mask_type& mask,
const I& indices, flags<Flags...> f = {});
template<simd-vec-type V, ranges::contiguous_range R, simd-integral I, class... Flags>
requires ranges::sized_range<R> && ranges::output_range<R, typename V::value_type>
constexpr void
partial_scatter_to(const V& v, R&& out,
const I& indices, flags<Flags...> f = {});
template<simd-vec-type V, ranges::contiguous_range R, simd-integral I, class... Flags>
requires ranges::sized_range<R> && ranges::output_range<R, typename V::value_type>
constexpr void
partial_scatter_to(const V& v, R&& out, const typename I::mask_type& mask,
const I& indices, flags<Flags...> f = {});
[…]
}
Modify 29.10.8.11 [simd.permute.memory] as indicated:
template<simd-vec-type V, ranges::contiguous_range R, simd-integral I, class... Flags> requires ranges::sized_range<R> && ranges::output_range<R, typename V::value_type> constexpr void unchecked_scatter_to(const V& v, R&& out, const I& indices, flags<Flags...> f = {}); template<simd-vec-type V, ranges::contiguous_range R, simd-integral I, class... Flags> requires ranges::sized_range<R> && ranges::output_range<R, typename V::value_type> constexpr void unchecked_scatter_to(const V& v, R&& out, const typename I::mask_type& mask, const I& indices, flags<Flags...> f = {});-10- Let
[…]maskbetypename I::mask_type(true)for the overload with nomaskparameter.template<simd-vec-type V, ranges::contiguous_range R, simd-integral I, class... Flags> requires ranges::sized_range<R> && ranges::output_range<R, typename V::value_type> constexpr void partial_scatter_to(const V& v, R&& out, const I& indices, flags<Flags...> f = {}); template<simd-vec-type V, ranges::contiguous_range R, simd-integral I, class... Flags> requires ranges::sized_range<R> && ranges::output_range<R, typename V::value_type> constexpr void partial_scatter_to(const V& v, R&& out, const typename I::mask_type& mask, const I& indices, flags<Flags...> f = {});-13- Let
[…]maskbetypename I::mask_type(true)for the overload with nomaskparameter.