blob: 662ecb9c955de0327f24f06489cb56aeb0b4d996 [file] [log] [blame]
#![warn(clippy::future_not_send)]
use std::cell::Cell;
use std::future::Future;
use std::rc::Rc;
use std::sync::Arc;
async fn private_future(rc: Rc<[u8]>, cell: &Cell<usize>) -> bool {
//~^ future_not_send
async { true }.await
}
pub async fn public_future(rc: Rc<[u8]>) {
//~^ future_not_send
async { true }.await;
}
pub async fn public_send(arc: Arc<[u8]>) -> bool {
async { false }.await
}
async fn private_future2(rc: Rc<[u8]>, cell: &Cell<usize>) -> bool {
//~^ future_not_send
true
}
pub async fn public_future2(rc: Rc<[u8]>) {}
//~^ future_not_send
pub async fn public_send2(arc: Arc<[u8]>) -> bool {
false
}
struct Dummy {
rc: Rc<[u8]>,
}
impl Dummy {
async fn private_future(&self) -> usize {
//~^ future_not_send
async { true }.await;
self.rc.len()
}
pub async fn public_future(&self) {
//~^ future_not_send
self.private_future().await;
}
#[allow(clippy::manual_async_fn)]
pub fn public_send(&self) -> impl std::future::Future<Output = bool> {
async { false }
}
}
async fn generic_future<T>(t: T) -> T
//~^ future_not_send
where
T: Send,
{
let rt = &t;
async { true }.await;
let _ = rt;
t
}
async fn maybe_send_generic_future<T>(t: T) -> T {
async { true }.await;
t
}
async fn maybe_send_generic_future2<F: Fn() -> Fut, Fut: Future>(f: F) {
async { true }.await;
let res = f();
async { true }.await;
}
async fn generic_future_always_unsend<T>(_: Rc<T>) {
//~^ future_not_send
async { true }.await;
}
async fn generic_future_send<T>(t: T)
where
T: Send,
{
async { true }.await;
}
async fn unclear_future<T>(t: T) {}
fn main() {
let rc = Rc::new([1, 2, 3]);
private_future(rc.clone(), &Cell::new(42));
public_future(rc.clone());
let arc = Arc::new([4, 5, 6]);
public_send(arc);
generic_future(42);
generic_future_send(42);
let dummy = Dummy { rc };
dummy.public_future();
dummy.public_send();
}