Skip to content

Commit 0888f71

Browse files
committed
New issue from Hewill: "simd::unchecked_scatter_to is underconstrained"
1 parent 3b8c13c commit 0888f71

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

xml/issue4393.xml

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?xml version='1.0' encoding='utf-8' standalone='no'?>
2+
<!DOCTYPE issue SYSTEM "lwg-issue.dtd">
3+
4+
<issue num="4393" status="New">
5+
<title>`simd::unchecked_scatter_to` is underconstrained</title>
6+
<section><sref ref="[simd.permute.memory]"/></section>
7+
<submitter>Hewill Kang</submitter>
8+
<date>29 Sep 2025</date>
9+
<priority>99</priority>
10+
11+
<discussion>
12+
<p>
13+
Both `simd::unchecked_scatter_to` and `simd::partial_scatter_to` are used to write a
14+
`simd::vec` into a range `R`.
15+
<p/>
16+
However, they only require `R` to be `contiguous_range` and `sized_range.
17+
Requiring `R` to be `output_range` is also necessary; otherwise, the
18+
`constant_range` cannot be written.
19+
</p>
20+
</discussion>
21+
22+
<resolution>
23+
<p>
24+
This wording is relative to <paper num="N5014"/>.
25+
</p>
26+
27+
<ol>
28+
29+
<li><p>Modify <sref ref="[simd.syn]"/> as indicated:</p>
30+
31+
<blockquote>
32+
<pre>
33+
namespace std::simd {
34+
[&hellip;]
35+
template&lt;<i>simd-vec-type</i> V, ranges::contiguous_range R, <i>simd-integral</i> I, class... Flags&gt;
36+
requires ranges::sized_range&lt;R&gt; <ins>&amp;&amp; ranges::output_range&lt;R, typename V::value_type&gt;</ins>
37+
constexpr void
38+
unchecked_scatter_to(const V&amp; v, R&amp;&amp; out,
39+
const I&amp; indices, flags&lt;Flags...&gt; f = {});
40+
template&lt;<i>simd-vec-type</i> V, ranges::contiguous_range R, <i>simd-integral</i> I, class... Flags&gt;
41+
requires ranges::sized_range&lt;R&gt; <ins>&amp;&amp; ranges::output_range&lt;R, typename V::value_type&gt;</ins>
42+
constexpr void
43+
unchecked_scatter_to(const V&amp; v, R&amp;&amp; out, const typename I::mask_type&amp; mask,
44+
const I&amp; indices, flags&lt;Flags...&gt; f = {});
45+
46+
template&lt;<i>simd-vec-type</i> V, ranges::contiguous_range R, <i>simd-integral</i> I, class... Flags&gt;
47+
requires ranges::sized_range&lt;R&gt; <ins>&amp;&amp; ranges::output_range&lt;R, typename V::value_type&gt;</ins>
48+
constexpr void
49+
partial_scatter_to(const V&amp; v, R&amp;&amp; out,
50+
const I&amp; indices, flags&lt;Flags...&gt; f = {});
51+
template&lt;<i>simd-vec-type</i> V, ranges::contiguous_range R, <i>simd-integral</i> I, class... Flags&gt;
52+
requires ranges::sized_range&lt;R&gt; <ins>&amp;&amp; ranges::output_range&lt;R, typename V::value_type&gt;</ins>
53+
constexpr void
54+
partial_scatter_to(const V&amp; v, R&amp;&amp; out, const typename I::mask_type&amp; mask,
55+
const I&amp; indices, flags&lt;Flags...&gt; f = {});
56+
[&hellip;]
57+
}
58+
</pre>
59+
</blockquote>
60+
</li>
61+
62+
<li><p>Modify <sref ref="[simd.permute.memory]"/> as indicated:</p>
63+
64+
<blockquote>
65+
<pre>
66+
template&lt;<i>simd-vec-type</i> V, ranges::contiguous_range R, <i>simd-integral</i> I, class... Flags&gt;
67+
requires ranges::sized_range&lt;R&gt; <ins>&amp;&amp; ranges::output_range&lt;R, typename V::value_type&gt;</ins>
68+
constexpr void unchecked_scatter_to(const V&amp; v, R&amp;&amp; out, const I&amp; indices,
69+
flags&lt;Flags...&gt; f = {});
70+
template&lt;<i>simd-vec-type</i> V, ranges::contiguous_range R, <i>simd-integral</i> I, class... Flags&gt;
71+
requires ranges::sized_range&lt;R&gt; <ins>&amp;&amp; ranges::output_range&lt;R, typename V::value_type&gt;</ins>
72+
constexpr void unchecked_scatter_to(const V&amp; v, R&amp;&amp; out, const typename I::mask_type&amp; mask,
73+
const I&amp; indices, flags&lt;Flags...&gt; f = {});
74+
</pre>
75+
<blockquote>
76+
<p>
77+
-10- Let `mask` be `typename I::mask_type(true)` for the overload with no `mask` parameter.
78+
<p/>
79+
[&hellip;]
80+
</p>
81+
</blockquote>
82+
<pre>
83+
template&lt;<i>simd-vec-type</i> V, ranges::contiguous_range R, <i>simd-integral</i> I, class... Flags&gt;
84+
requires ranges::sized_range&lt;R&gt; <ins>&amp;&amp; ranges::output_range&lt;R, typename V::value_type&gt;</ins>
85+
constexpr void
86+
partial_scatter_to(const V&amp; v, R&amp;&amp; out, const I&amp; indices, flags&lt;Flags...&gt; f = {});
87+
template&lt;<i>simd-vec-type</i> V, ranges::contiguous_range R, <i>simd-integral</i> I, class... Flags&gt;
88+
requires ranges::sized_range&lt;R&gt; <ins>&amp;&amp; ranges::output_range&lt;R, typename V::value_type&gt;</ins>
89+
constexpr void partial_scatter_to(const V&amp; v, R&amp;&amp; out, const typename I::mask_type&amp; mask,
90+
const I&amp; indices, flags&lt;Flags...&gt; f = {});
91+
</pre>
92+
<blockquote>
93+
<p>
94+
-13- Let `mask` be `typename I::mask_type(true)` for the overload with no `mask` parameter.
95+
<p/>
96+
[&hellip;]
97+
</p>
98+
</blockquote>
99+
</blockquote>
100+
</li>
101+
</ol>
102+
103+
</resolution>
104+
105+
</issue>

0 commit comments

Comments
 (0)