From f28da1c40c9a4653f6dec62510487c1c139ac909 Mon Sep 17 00:00:00 2001 From: Eric Niebler Date: Mon, 6 Apr 2026 17:29:34 -0700 Subject: [PATCH] be explicit in `into_variant` about which variant alternative is being initialized fixes #1988 --- include/stdexec/__detail/__into_variant.hpp | 5 +++-- include/stdexec/__detail/__when_all.hpp | 14 +++++++++++--- test/stdexec/algos/adaptors/test_when_all.cpp | 10 ++++++++++ 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/include/stdexec/__detail/__into_variant.hpp b/include/stdexec/__detail/__into_variant.hpp index 0f011bf8b..adc52c703 100644 --- a/include/stdexec/__detail/__into_variant.hpp +++ b/include/stdexec/__detail/__into_variant.hpp @@ -83,8 +83,9 @@ namespace STDEXEC STDEXEC_TRY { STDEXEC::set_value(static_cast<_State&&>(__state).__rcvr_, - __variant_t{ - std::tuple<_Args&&...>{static_cast<_Args&&>(__args)...}}); + __variant_t{std::in_place_type<__decayed_std_tuple<_Args...>>, + std::tuple<_Args&&...>{ + static_cast<_Args&&>(__args)...}}); } STDEXEC_CATCH_ALL { diff --git a/include/stdexec/__detail/__when_all.hpp b/include/stdexec/__detail/__when_all.hpp index 97a8b13c6..a11e82eaf 100644 --- a/include/stdexec/__detail/__when_all.hpp +++ b/include/stdexec/__detail/__when_all.hpp @@ -56,6 +56,16 @@ namespace STDEXEC struct when_all_with_variant_t { + private: + static constexpr auto __mk_transform_fn() noexcept + { + return [](__ignore, __ignore, _Child&&... __child) + { + return when_all(into_variant(static_cast<_Child&&>(__child))...); + }; + } + + public: template constexpr auto operator()(_Senders&&... __sndrs) const -> __well_formed_sender auto { @@ -66,9 +76,7 @@ namespace STDEXEC static constexpr auto transform_sender(set_value_t, _Sender&& __sndr, __ignore) { // transform when_all_with_variant(sndrs...) into when_all(into_variant(sndrs)...). - return __apply([&](__ignore, __ignore, _Child&&... __child) - { return when_all(into_variant(static_cast<_Child&&>(__child))...); }, - static_cast<_Sender&&>(__sndr)); + return __apply(__mk_transform_fn(), static_cast<_Sender&&>(__sndr)); } }; diff --git a/test/stdexec/algos/adaptors/test_when_all.cpp b/test/stdexec/algos/adaptors/test_when_all.cpp index 0316806e5..631eb304e 100644 --- a/test/stdexec/algos/adaptors/test_when_all.cpp +++ b/test/stdexec/algos/adaptors/test_when_all.cpp @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -461,4 +462,13 @@ namespace scope.request_stop(); ex::sync_wait(scope.on_empty()); } + + TEST_CASE("regression test for #1988", "[adaptors][when_all") + { + // just test that this compiles: + using any_sender = exec::any_sender< + exec::any_receiver>>; + ex::sync_wait(ex::when_all_with_variant(any_sender{ex::just(1)})); + SUCCEED(); + } } // namespace