@@ -379,19 +379,23 @@ namespace stdexec {
379379 // return a reference to the first child env for which
380380 // __queryable<_Envs, _Query, _Args...> is true.
381381 template <class _Query , class ... _Args>
382- STDEXEC_ATTRIBUTE ((always_inline)) constexpr auto __get_1st () const noexcept -> decltype(auto ) {
382+ STDEXEC_ATTRIBUTE ((always_inline)) static constexpr auto __get_1st (const env& __self) noexcept -> decltype(auto ) {
383383 // NOLINTNEXTLINE (modernize-avoid-c-arrays)
384384 constexpr bool __flags[] = {__queryable<_Envs, _Query, _Args...>...};
385385 constexpr std::size_t __idx = __pos_of (__flags, __flags + sizeof ...(_Envs));
386- return __tup_.template __get <__idx>(__tup_);
386+ return __self. __tup_ .template __get <__idx>(__self. __tup_ );
387387 }
388388
389+ template <class _Query , class ... _Args>
390+ using __1st_env_t = decltype (env::__get_1st<_Query, _Args...>(__declval<const env&>()));
391+
389392 template <class _Query , class ... _Args>
390393 requires (__queryable<_Envs, _Query, _Args...> || ...)
391- STDEXEC_ATTRIBUTE ((always_inline)) constexpr auto query (_Query __q, _Args&&... __args) const
392- noexcept (__nothrow_queryable<decltype (__get_1st <_Query, _Args...>()) , _Query, _Args...>)
394+ STDEXEC_ATTRIBUTE ((always_inline)) constexpr auto query (_Query __q, _Args&&... __args) const //
395+ noexcept (__nothrow_queryable<__1st_env_t <_Query, _Args...>, _Query, _Args...>)
393396 -> decltype(auto ) {
394- return tag_invoke (__q, __get_1st<_Query, _Args...>(), static_cast <_Args&&>(__args)...);
397+ return tag_invoke (
398+ __q, env::__get_1st<_Query, _Args...>(*this ), static_cast <_Args&&>(__args)...);
395399 }
396400
397401 auto operator =(const env&) -> env& = delete ;
@@ -409,20 +413,24 @@ namespace stdexec {
409413 // return a reference to the first child env for which
410414 // __queryable<_Envs, _Query, _Args...> is true.
411415 template <class _Query , class ... _Args>
412- STDEXEC_ATTRIBUTE ((always_inline)) constexpr auto __get_1st () const noexcept -> decltype(auto ) {
416+ STDEXEC_ATTRIBUTE ((always_inline)) static constexpr auto __get_1st (const env& __self) noexcept -> decltype(auto ) {
413417 if constexpr (__queryable<_Env0, _Query, _Args...>) {
414- return (__env0_);
418+ return (__self. __env0_ );
415419 } else {
416- return (__env1_);
420+ return (__self. __env1_ );
417421 }
418422 }
419423
424+ template <class _Query , class ... _Args>
425+ using __1st_env_t = decltype (env::__get_1st<_Query, _Args...>(__declval<const env&>()));
426+
420427 template <class _Query , class ... _Args>
421428 requires __queryable<_Env0, _Query, _Args...> || __queryable<_Env1, _Query, _Args...>
422429 STDEXEC_ATTRIBUTE ((always_inline)) constexpr auto query (_Query __q, _Args&&... __args) const
423- noexcept (__nothrow_queryable<decltype (__get_1st <_Query, _Args...>()) , _Query, _Args...>)
430+ noexcept (__nothrow_queryable<__1st_env_t <_Query, _Args...>, _Query, _Args...>)
424431 -> decltype(auto ) {
425- return tag_invoke (__q, __get_1st<_Query, _Args...>(), static_cast <_Args&&>(__args)...);
432+ return tag_invoke (
433+ __q, env::__get_1st<_Query, _Args...>(*this ), static_cast <_Args&&>(__args)...);
426434 }
427435
428436 auto operator =(const env&) -> env& = delete ;
0 commit comments