Compile Error When Wrapping Receiver by Derivation
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
Direzione di ricerca
Riproduci il malfunzionamento con l’esempio di sender e receiver, usando il build.log allegato come diagnostica prevista. Inizia da include/stdexec/__detail/__basic_sender.hpp, riga 362, e traccia come viene utilizzato il tipo di receiver derivato durante la connessione dell’operazione. Il lavoro è completato quando l’esempio viene compilato senza confondere il receiver derivato con il suo tipo base.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Given:
template<::stdexec::receiver Receiver>
struct receiver : Receiver {
template<typename T>
requires std::constructible_from<Receiver, T>
explicit constexpr receiver(T&& t) noexcept(
std::is_nothrow_constructible_v<Receiver, T>)
: Receiver(std::forward<T>(t))
{}
};
template<::stdexec::sender Sender>
struct sender {
using sender_concept = ::stdexec::sender_t;
template<typename T>
requires std::constructible_from<Sender, T>
explicit constexpr sender(T&& t) noexcept(
std::is_nothrow_constructible_v<Sender, T>)
: sender_(std::forward<T>(t))
{}
template<typename Self, typename Env>
::stdexec::completion_signatures_of_t<
decltype(std::declval<Self>().sender_),
Env> get_completion_signatures(this Self&&, const Env&);
template<typename Self, typename Receiver>
requires ::stdexec::sender_to<
Sender,
receiver<std::remove_cvref_t<Receiver>>>
auto connect(this Self&& self, Receiver&& r) noexcept(
noexcept(
::stdexec::connect(
std::declval<Self>().sender_,
receiver<std::remove_cvref_t<Receiver>>(std::declval<Receiver>()))))
{
return ::stdexec::connect(
std::forward<Self>(self).sender_,
receiver<std::remove_cvref_t<Receiver>>(std::forward<Receiver>(r)));
}
private:
Sender sender_;
};
template<typename T>
explicit sender(T) -> sender<T>;
The following fails to compile (at least on GCC 14.1.0):
auto op = ::stdexec::connect(
::stdexec::just() | ::stdexec::let_value([]() {
return sender(
::stdexec::just() | ::stdexec::then([]() noexcept {
return 5;
}));
}),
make_receiver([](auto&&...) noexcept {}));
Where the make_receiver invocation simply creates a receiver that accepts anything.
Internally the machinery seems to be confusing the derived type with the base type:
/scratch/mdx/src/../include/stdexec/__detail/__basic_sender.hpp:362:84: error: cannot convert ‘stdexec::__detail::__op_state<stdexec::__sexpr<<lambda closure object>stdexec::{anonymous}::<lambda()>(), stdexec::{anonymous}::__anon>, mdx::execution::tests::{anonymous}::receiver<stdexec::__any_::__receiver_ref<stdexec::completion_signatures<stdexec::__rcvrs::set_value_t(int)> > > >* const’ to ‘stdexec::__detail::__receiver<stdexec::__any_::__receiver_ref<stdexec::completion_signatures<stdexec::__rcvrs::set_value_t(int)> >, stdexec::__sexpr<<lambda closure object>stdexec::{anonymous}::<lambda()>(), stdexec::{anonymous}::__anon>, stdexec::__muchar (*)[1]>::__t::__parent_op_t*’ {aka ‘stdexec::__detail::__op_state<stdexec::__sexpr<<lambda closure object>stdexec::{anonymous}::<lambda()>(), stdexec::{anonymous}::__anon>, stdexec::__any_::__receiver_ref<stdexec::completion_signatures<stdexec::__rcvrs::set_value_t(int)> > >*’} in initialization
362 | return __tuple{connect(static_cast<_Child&&>(__child), __receiver_t<_Is>{__op_})...};
| ^~~~~
| |
| stdexec::__detail::__op_state<stdexec::__sexpr<<lambda closure object>stdexec::{anonymous}::<lambda()>(), stdexec::{anonymous}::__anon>, mdx::execution::tests::{anonymous}::receiver<stdexec::__any_::__receiver_ref<stdexec::completion_signatures<stdexec::__rcvrs::set_value_t(int)> > > >* const
Full compilation output attached.
- Lingua principale
- C++
- Stelle
- 2.4k
- Fork
- 270
- Merge medio
- 1g 10h
- PR unite (30g)
- 35
Preparare l'ambiente
Non abbiamo ancora controllato i file di configurazione di questo progetto. Parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di NVIDIA/stdexec
-
inline_scheduler's namespace-scope static_assert fails under nvcc (private nested __sender access)Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
NVIDIA/stdexec#1751 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
NVIDIA/stdexec#2268 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
NVIDIA/stdexec#2240 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di NVIDIA/stdexec
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 92/100
sandialabs/seacas#945 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
ROCm/FastFlowLM#757 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 92/100
espressif/esp-matter#1867 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
mltframework/shotcut#1920 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno