diff --git a/source/exec.tex b/source/exec.tex index 6e99784a93..2ef05d770a 100644 --- a/source/exec.tex +++ b/source/exec.tex @@ -1185,7 +1185,8 @@ { get_env(rcvr) } -> @\exposconcept{queryable}@; } && @\libconcept{move_constructible}@> && // rvalues are movable, and - @\libconcept{constructible_from}@, Rcvr>; // lvalues are copyable + @\libconcept{constructible_from}@, Rcvr> && // lvalues are copyable + is_nothrow_move_constructible_v>; template concept @\defexposconcept{valid-completion-for}@ = // \expos @@ -2856,6 +2857,21 @@ Otherwise, \tcode{\exposid{connect-awaitable}(new_sndr, rcvr)}. \end{itemize} Except that \tcode{rcvr} is evaluated only once. +The program is ill-formed, no diagnostic required, +if there exists an rvalue expression \tcode{rcvr2} such that: +\begin{itemize} +\item \tcode{decltype(rcvr2)} models \libconcept{receiver}, +\item \tcode{noexcept(rcvr2)} is \tcode{true}, +\item \tcode{is_same_v} is \tcode{true}, +\item \tcode{noexcept(execution::connect(sndr, rcvr))} is \tcode{true}, and +\item \tcode{noexcept(execution::connect(sndr, rcvr2))} +is well-formed and evaluates to \tcode{false}. +\end{itemize} +\begin{note} +This allows determination of whether \tcode{connect} throws +with only the context of the environment, +such as within \tcode{get_completion_signatures}. +\end{note} \mandates The following are \tcode{true}: