@@ -377,6 +377,11 @@ namespace stdexec {
377377 template <class _Env , class _Query , class ... _Args>
378378 concept __nothrow_queryable = nothrow_tag_invocable<_Query, const _Env&, _Args...>;
379379
380+ template <class _Env , class _Query , class ... _Args>
381+ concept __statically_queryable = requires {
382+ std::remove_reference_t <_Env>::query (std::declval<_Query>(), std::declval<_Args>()...);
383+ };
384+
380385 template <class _Env , class _Query , class ... _Args>
381386 using __query_result_t = tag_invoke_result_t <_Query, const _Env&, _Args...>;
382387
@@ -457,15 +462,11 @@ namespace stdexec {
457462 // This is useful for constexpr evaluation of queries.
458463 template <class _Query , class ... _Args>
459464 requires (__queryable<_Envs, _Query, _Args...> || ...)
465+ && __statically_queryable<__1st_env_t <_Query, _Args...>, _Query, _Args...>
460466 STDEXEC_ATTRIBUTE (nodiscard, always_inline)
461467 static constexpr auto query (_Query __q, _Args&&... __args)
462468 noexcept (__nothrow_queryable<__1st_env_t <_Query, _Args...>, _Query, _Args...>)
463- -> decltype(auto )
464- requires requires {
465- std::remove_reference_t <__1st_env_t <_Query, _Args...>>::query (
466- __q, static_cast <_Args &&>(__args)...);
467- }
468- {
469+ -> decltype(auto ) {
469470 return std::remove_reference_t <__1st_env_t <_Query, _Args...>>::query (
470471 __q, static_cast <_Args&&>(__args)...);
471472 }
@@ -508,17 +509,12 @@ namespace stdexec {
508509 // NOT TO SPEC: a static query memfn for those envs that have a static query memfn.
509510 // This is useful for constexpr evaluation of queries.
510511 template <class _Query , class ... _Args>
511- requires __queryable<_Env0, _Query, _Args...>
512- || __queryable<_Env1, _Query, _Args...>
513- STDEXEC_ATTRIBUTE (nodiscard, always_inline)
514- static constexpr auto query (_Query __q, _Args&&... __args)
515- noexcept (__nothrow_queryable<__1st_env_t <_Query, _Args...>, _Query, _Args...>)
516- -> decltype(auto )
517- requires requires {
518- std::remove_reference_t <__1st_env_t <_Query, _Args...>>::query (
519- __q, static_cast <_Args &&>(__args)...);
520- }
521- {
512+ requires (__queryable<_Env0, _Query, _Args...> || __queryable<_Env1, _Query, _Args...>)
513+ && __statically_queryable<__1st_env_t <_Query, _Args...>, _Query, _Args...>
514+ STDEXEC_ATTRIBUTE (nodiscard, always_inline)
515+ static constexpr auto query (_Query __q, _Args&&... __args)
516+ noexcept (__nothrow_queryable<__1st_env_t <_Query, _Args...>, _Query, _Args...>)
517+ -> decltype(auto ) {
522518 return std::remove_reference_t <__1st_env_t <_Query, _Args...>>::query (
523519 __q, static_cast <_Args&&>(__args)...);
524520 }
0 commit comments