| #![feature(async_closure)] |
| 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() }; |
| fn we_only_care_about_clonable_upvars() { |
| let x = NotClonableUpvar; |
| // Notably, this is clone because we capture `&x`. |
| let yes_clone = async || { |
| 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 || { |
| //~^ ERROR the trait bound `NotClonableUpvar: Clone` is not satisfied |