Skip to content

Commit dc8f168

Browse files
authored
Merge pull request #1494 from NVIDIA/conformance-issue-in-env
clangd complaining about the definition of `env::query`
2 parents b838edd + ba964c2 commit dc8f168

1 file changed

Lines changed: 18 additions & 10 deletions

File tree

include/stdexec/__detail/__env.hpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)