diff --git a/futures-util/src/future/mod.rs b/futures-util/src/future/mod.rs index ca9e6efba2..094857fe34 100644 --- a/futures-util/src/future/mod.rs +++ b/futures-util/src/future/mod.rs @@ -9,6 +9,10 @@ use futures_core::future::Future; use futures_core::stream::Stream; use futures_core::task::{LocalWaker, Poll}; +// re-export for `select!` +#[doc(hidden)] +pub use futures_core::future::FusedFuture; + // Primitive futures mod empty; pub use self::empty::{empty, Empty}; diff --git a/futures-util/src/task/mod.rs b/futures-util/src/task/mod.rs index 93266e6f16..5d87ed8f73 100644 --- a/futures-util/src/task/mod.rs +++ b/futures-util/src/task/mod.rs @@ -16,3 +16,7 @@ pub use self::local_waker_ref::{local_waker_ref, local_waker_ref_from_nonlocal, cfg(all(target_has_atomic = "cas", target_has_atomic = "ptr")) )] pub use futures_core::task::__internal::AtomicWaker; + +// re-export for `select!` +#[doc(hidden)] +pub use futures_core::task::{LocalWaker, Poll}; diff --git a/futures-util/tests/select_next_some.rs b/futures-util/tests/select_next_some.rs index 926c8984d0..7228e57df0 100644 --- a/futures-util/tests/select_next_some.rs +++ b/futures-util/tests/select_next_some.rs @@ -55,3 +55,32 @@ fn select() { assert_eq!(total, 6); }); } + +// Check that `select!` macro does not fail when importing from `futures_util`. +#[test] +fn futures_util_select() { + use futures_util::select; + + // Checks that even though `async_tasks` will yield a `None` and return + // `is_terminated() == true` during the first poll, it manages to toggle + // back to having items after a future is pushed into it during the second + // poll (after pending_once completes). + futures::executor::block_on(async { + let mut fut = future::ready(1).pending_once(); + let mut async_tasks = FuturesUnordered::new(); + let mut total = 0; + loop { + select! { + num = fut => { + total += num; + async_tasks.push(async { 5 }); + }, + num = async_tasks.select_next_some() => { + total += num; + } + complete => break, + } + } + assert_eq!(total, 6); + }); +}