37 lines
988 B
Rust
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() {}
|