From 420a677589670bde08f9d7aa3768b8b9a19e7adf Mon Sep 17 00:00:00 2001 From: Eric Niebler Date: Thu, 31 Jul 2025 12:58:59 -0700 Subject: [PATCH] disable clang warning about pack indexing in C++20 --- include/stdexec/__detail/__config.hpp | 9 +++++++++ include/stdexec/__detail/__meta.hpp | 9 ++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/include/stdexec/__detail/__config.hpp b/include/stdexec/__detail/__config.hpp index fba813709..3c4e6fb68 100644 --- a/include/stdexec/__detail/__config.hpp +++ b/include/stdexec/__detail/__config.hpp @@ -398,6 +398,15 @@ namespace stdexec { # define STDEXEC_TERMINATE() std::terminate() #endif +// Some compilers turn on pack indexing in pre-C++26 code. We want to use it if it is +// available. Pack indexing is disabled for clang < 20 because of: +// https://github.com/llvm/llvm-project/issues/116105 +#if defined(__cpp_pack_indexing) && !STDEXEC_NVCC() && !(STDEXEC_CLANG() && __clang_major__ < 20) +# define STDEXEC_HAS_PACK_INDEXING() 1 +#else // ^^^ has pack indexing ^^^ / vvv no pack indexing vvv +# define STDEXEC_HAS_PACK_INDEXING() 0 +#endif // no pack indexing + #if STDEXEC_HAS_FEATURE(thread_sanitizer) || defined(__SANITIZE_THREAD__) # define STDEXEC_TSAN(...) STDEXEC_HEAD_OR_TAIL(1, __VA_ARGS__) #else diff --git a/include/stdexec/__detail/__meta.hpp b/include/stdexec/__detail/__meta.hpp index 424da22e6..d4214dc6e 100644 --- a/include/stdexec/__detail/__meta.hpp +++ b/include/stdexec/__detail/__meta.hpp @@ -1025,9 +1025,10 @@ namespace stdexec { using __f = __mor<__minvoke<_Fn, _Args>...>; }; -// C++23 pack indexing is disabled for clang because of -// https://github.com/llvm/llvm-project/issues/116105 -#if defined(__cpp_pack_indexing) && !STDEXEC_CLANG() +#if STDEXEC_HAS_PACK_INDEXING() + STDEXEC_PRAGMA_PUSH() + STDEXEC_PRAGMA_IGNORE_GNU("-Wc++26-extensions") + template struct __m_at_ { template @@ -1039,6 +1040,8 @@ namespace stdexec { template using __m_at_c = __minvoke<__m_at_<_Np == ~0ul>, __msize_t<_Np>, _Ts...>; + + STDEXEC_PRAGMA_POP() #elif STDEXEC_HAS_BUILTIN(__type_pack_element) template struct __m_at_ {