rust/tests/ui/async-await/async-closures/not-clone-closure.rs

37 lines
988 B
Rust

//@ edition: 2021
#![feature(async_closure)]
struct NotClonableArg;
#[derive(Default)]
struct NotClonableReturnType;
// Verify that the only components that we care about are the upvars, not the signature.
fn we_are_okay_with_not_clonable_signature() {
let x = async |x: NotClonableArg| -> NotClonableReturnType { Default::default() };
x.clone(); // Okay
}
#[derive(Debug)]
struct NotClonableUpvar;
fn we_only_care_about_clonable_upvars() {
let x = NotClonableUpvar;
// Notably, this is clone because we capture `&x`.
let yes_clone = async || {
println!("{x:?}");
};
yes_clone.clone(); // Okay
let z = NotClonableUpvar;
// However, this is not because the closure captures `z` by move.
// (Even though the future that is lent out captures `z by ref!)
let not_clone = async move || {
println!("{z:?}");
};
not_clone.clone();
//~^ ERROR the trait bound `NotClonableUpvar: Clone` is not satisfied
}
fn main() {}