Skip to content

Commit 1c7d53a

Browse files
committed
[simd] Resolve LWG4420 and LWG4393
1 parent ca77cdb commit 1c7d53a

File tree

1 file changed

+56
-38
lines changed

1 file changed

+56
-38
lines changed

source/numerics.tex

Lines changed: 56 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16232,6 +16232,12 @@
1623216232
bool_constant<T() == T::value>::value &&
1623316233
bool_constant<static_cast<decltype(T::value)>(T()) == T::value>::value;
1623416234

16235+
template<class From, class To>
16236+
concept @\defexposconceptnc{explicitly-convertible-to}@ = // \expos
16237+
requires {
16238+
static_cast<To>(declval<From>());
16239+
};
16240+
1623516241
template<class T> using @\exposidnc{deduced-vec-t} = \seebelownc@; // \expos
1623616242

1623716243
template<class V, class T> using @\exposidnc{make-compatible-simd-t} = \seebelownc@; // \expos
@@ -16576,54 +16582,46 @@
1657616582
flags<Flags...> f = {});
1657716583

1657816584
template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags>
16579-
requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T>
16585+
requires ranges::@\libconcept{sized_range}@<R>
1658016586
constexpr void unchecked_store(const basic_vec<T, Abi>& v, R&& r,
1658116587
flags<Flags...> f = {});
1658216588
template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags>
16583-
requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T>
16589+
requires ranges::@\libconcept{sized_range}@<R>
1658416590
constexpr void unchecked_store(const basic_vec<T, Abi>& v, R&& r,
1658516591
const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});
1658616592
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags>
16587-
requires @\libconcept{indirectly_writable}@<I, T>
1658816593
constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first,
1658916594
iter_difference_t<I> n, flags<Flags...> f = {});
1659016595
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags>
16591-
requires @\libconcept{indirectly_writable}@<I, T>
1659216596
constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first,
1659316597
iter_difference_t<I> n, const typename basic_vec<T, Abi>::mask_type& mask,
1659416598
flags<Flags...> f = {});
1659516599
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags>
16596-
requires @\libconcept{indirectly_writable}@<I, T>
1659716600
constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, S last,
1659816601
flags<Flags...> f = {});
1659916602
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags>
16600-
requires @\libconcept{indirectly_writable}@<I, T>
1660116603
constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, S last,
1660216604
const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});
1660316605

1660416606
template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags>
16605-
requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T>
16607+
requires ranges::@\libconcept{sized_range}@<R>
1660616608
constexpr void partial_store(const basic_vec<T, Abi>& v, R&& r,
1660716609
flags<Flags...> f = {});
1660816610
template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags>
16609-
requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T>
16611+
requires ranges::@\libconcept{sized_range}@<R>
1661016612
constexpr void partial_store(const basic_vec<T, Abi>& v, R&& r,
1661116613
const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});
1661216614
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags>
16613-
requires @\libconcept{indirectly_writable}@<I, T>
1661416615
constexpr void partial_store(
1661516616
const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n, flags<Flags...> f = {});
1661616617
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags>
16617-
requires @\libconcept{indirectly_writable}@<I, T>
1661816618
constexpr void partial_store(
1661916619
const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n,
1662016620
const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});
1662116621
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags>
16622-
requires @\libconcept{indirectly_writable}@<I, T>
1662316622
constexpr void partial_store(const basic_vec<T, Abi>& v, I first, S last,
1662416623
flags<Flags...> f = {});
1662516624
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags>
16626-
requires @\libconcept{indirectly_writable}@<I, T>
1662716625
constexpr void partial_store(const basic_vec<T, Abi>& v, I first, S last,
1662816626
const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});
1662916627

@@ -17747,7 +17745,12 @@
1774717745
\begin{itemdescr}
1774817746
\pnum
1774917747
\constraints
17750-
\tcode{\exposid{simd-size-v}<U, UAbi> == size()} is \tcode{true}.
17748+
\begin{itemize}
17749+
\item
17750+
\tcode{\exposid{simd-size-v}<U, UAbi> == size()} is \tcode{true}, and
17751+
\item
17752+
\tcode{U} satisfies \tcode{exposconcept{explicitly-convertible-to}<T>}.
17753+
\end{itemize}
1775117754

1775217755
\pnum
1775317756
\effects
@@ -17819,20 +17822,17 @@
1781917822
\begin{itemize}
1782017823
\item \tcode{R} models \tcode{ranges::\libconcept{contiguous_range}} and
1782117824
\tcode{ranges::\libconcept{sized_range}},
17822-
\item \tcode{ranges::size(r)} is a constant expression, and
17823-
\item \tcode{ranges::size(r)} is equal to \tcode{size()}.
17825+
\item \tcode{ranges::size(r)} is a constant expression,
17826+
\item \tcode{ranges::size(r)} is equal to \tcode{size()}, and
17827+
\item \tcode{ranges::range_value_t<R>} is a vectorizable type and satisfies
17828+
\tcode{\exposconcept{explicitly-convertible-to}<T>}.
1782417829
\end{itemize}
1782517830

1782617831
\pnum
1782717832
\mandates
17828-
\begin{itemize}
17829-
\item
17830-
\tcode{ranges::range_value_t<R>} is a vectorizable type, and
17831-
\item
17832-
if the template parameter pack \tcode{Flags} does not contain
17833-
\tcode{\exposid{convert-flag}}, then the conversion from
17834-
\tcode{ranges::range_value_t<R>} to \tcode{value_type} is value-preserving.
17835-
\end{itemize}
17833+
If the template parameter pack \tcode{Flags} does not contain
17834+
\tcode{\exposid{convert-flag}}, then the conversion from
17835+
\tcode{ranges::range_value_t<R>} to \tcode{value_type} is value-preserving.
1783617836

1783717837
\pnum
1783817838
\expects
@@ -18575,7 +18575,8 @@
1857518575
\mandates
1857618576
\begin{itemize}
1857718577
\item
18578-
\tcode{ranges::range_value_t<R>} is a vectorizable type,
18578+
\tcode{ranges::range_value_t<R>} is a vectorizable type and satisfies
18579+
\tcode{\exposconcept{explicitly-convertible-to}<T>},
1857918580
\item
1858018581
\tcode{same_as<remove_cvref_t<V>, V>} is \tcode{true},
1858118582
\item
@@ -18622,26 +18623,22 @@
1862218623
\indexlibrarymember{unchecked_store}{simd}
1862318624
\begin{itemdecl}
1862418625
template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags>
18625-
requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T>
18626+
requires ranges::@\libconcept{sized_range}@<R>
1862618627
constexpr void unchecked_store(const basic_vec<T, Abi>& v, R&& r, flags<Flags...> f = {});
1862718628
template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags>
18628-
requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T>
18629+
requires ranges::@\libconcept{sized_range}@<R>
1862918630
constexpr void unchecked_store(const basic_vec<T, Abi>& v, R&& r,
1863018631
const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});
1863118632
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags>
18632-
requires @\libconcept{indirectly_writable}@<I, T>
1863318633
constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n,
1863418634
flags<Flags...> f = {});
1863518635
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags>
18636-
requires @\libconcept{indirectly_writable}@<I, T>
1863718636
constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n,
1863818637
const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});
1863918638
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags>
18640-
requires @\libconcept{indirectly_writable}@<I, T>
1864118639
constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, S last,
1864218640
flags<Flags...> f = {});
1864318641
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags>
18644-
requires @\libconcept{indirectly_writable}@<I, T>
1864518642
constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, S last,
1864618643
const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});
1864718644
\end{itemdecl}
@@ -18688,26 +18685,22 @@
1868818685
\indexlibrarymember{partial_store}{simd}
1868918686
\begin{itemdecl}
1869018687
template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags>
18691-
requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T>
18688+
requires ranges::@\libconcept{sized_range}@<R>
1869218689
constexpr void partial_store(const basic_vec<T, Abi>& v, R&& r, flags<Flags...> f = {});
1869318690
template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags>
18694-
requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T>
18691+
requires ranges::@\libconcept{sized_range}@<R>
1869518692
constexpr void partial_store(const basic_vec<T, Abi>& v, R&& r,
1869618693
const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});
1869718694
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags>
18698-
requires @\libconcept{indirectly_writable}@<I, T>
1869918695
constexpr void partial_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n,
1870018696
flags<Flags...> f = {});
1870118697
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags>
18702-
requires @\libconcept{indirectly_writable}@<I, T>
1870318698
constexpr void partial_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n,
1870418699
const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});
1870518700
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags>
18706-
requires @\libconcept{indirectly_writable}@<I, T>
1870718701
constexpr void partial_store(const basic_vec<T, Abi>& v, I first, S last,
1870818702
flags<Flags...> f = {});
1870918703
template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags>
18710-
requires @\libconcept{indirectly_writable}@<I, T>
1871118704
constexpr void partial_store(const basic_vec<T, Abi>& v, I first, S last,
1871218705
const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});
1871318706
\end{itemdecl}
@@ -18728,6 +18721,17 @@
1872818721
parameter.
1872918722
\end{itemize}
1873018723

18724+
\pnum
18725+
\constraints
18726+
\begin{itemize}
18727+
\item
18728+
\tcode{ranges::iterator_t<R>} satisfies
18729+
\tcode{\libconcept{indirectly_writable}<ranges::range_value_t<R>>}, and
18730+
\item
18731+
\tcode{T} satisfies
18732+
\tcode{\exposconcept{explicitly-convertible-to}<ranges::range_value_t<R>>}.
18733+
\end{itemize}
18734+
1873118735
\pnum
1873218736
\mandates
1873318737
\begin{itemize}
@@ -18763,7 +18767,7 @@
1876318767
\effects
1876418768
For all $i$ in the range of \range{0}{basic_vec<T, Abi>::size()}, if
1876518769
\tcode{mask[$i$] \&\& $i$ < ranges::\brk{}size(r)} is \tcode{true}, evaluates
18766-
\tcode{ranges::data(r)[$i$] = v[$i$]}.
18770+
\tcode{ranges::data(r)[$i$] = static_cast<ranges::range_value_t<R>>(v[$i$])}.
1876718771
\end{itemdescr}
1876818772

1876918773
\rSec3[simd.permute.static]{Static permute}
@@ -18995,6 +18999,11 @@
1899518999
\tcode{T} be \tcode{typename V::value_type}.
1899619000
\end{itemize}
1899719001

19002+
\pnum
19003+
\constraints
19004+
\tcode{ranges::range_value_t<R>} is a vectorizable type and satisfies
19005+
\tcode{\exposconcept{explicitly-convertible-to}<T>}.
19006+
1899819007
\pnum
1899919008
\mandates
1900019009
\begin{itemize}
@@ -19086,7 +19095,16 @@
1908619095

1908719096
\pnum
1908819097
\constraints
19089-
\tcode{V::size() == I::size()} is \tcode{true}.
19098+
\begin{itemize}
19099+
\item
19100+
\tcode{V::size() == I::size()} is \tcode{true},
19101+
\item
19102+
\tcode{ranges::iterator_t<R>} satisfies
19103+
\tcode{\libconcept{indirectly_writable}<ranges::range_value_t<R>>}, and
19104+
\item
19105+
\tcode{typename V::value_type} satisfies
19106+
\tcode{\exposconcept{explicitly-convertible-to}<ranges::range_value_t<R>>}.
19107+
\end{itemize}
1909019108

1909119109
\pnum
1909219110
\mandates

0 commit comments

Comments
 (0)