2020-07-21 18:56:21 +00:00
|
|
|
//@ edition:2018
|
|
|
|
#![feature(async_closure)]
|
|
|
|
use std::future::Future;
|
|
|
|
|
|
|
|
// test the quality of annotations giving lifetimes names (`'1`) when async constructs are involved
|
|
|
|
|
|
|
|
pub async fn async_fn(x: &mut i32) -> &i32 {
|
|
|
|
let y = &*x;
|
|
|
|
*x += 1; //~ ERROR cannot assign to `*x` because it is borrowed
|
|
|
|
y
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn async_closure(x: &mut i32) -> impl Future<Output=&i32> {
|
|
|
|
(async move || {
|
2024-01-25 03:50:23 +00:00
|
|
|
//~^ ERROR lifetime may not live long enough
|
|
|
|
//~| ERROR temporary value dropped while borrowed
|
2020-07-21 18:56:21 +00:00
|
|
|
let y = &*x;
|
|
|
|
*x += 1; //~ ERROR cannot assign to `*x` because it is borrowed
|
|
|
|
y
|
|
|
|
})()
|
|
|
|
}
|
|
|
|
|
2020-09-08 04:35:24 +00:00
|
|
|
pub fn async_closure_explicit_return_type(x: &mut i32) -> impl Future<Output=&i32> {
|
|
|
|
(async move || -> &i32 {
|
2024-01-25 03:50:23 +00:00
|
|
|
//~^ ERROR lifetime may not live long enough
|
|
|
|
//~| ERROR temporary value dropped while borrowed
|
2020-09-08 04:35:24 +00:00
|
|
|
let y = &*x;
|
|
|
|
*x += 1; //~ ERROR cannot assign to `*x` because it is borrowed
|
|
|
|
y
|
|
|
|
})()
|
|
|
|
}
|
|
|
|
|
2020-07-21 18:56:21 +00:00
|
|
|
pub fn async_block(x: &mut i32) -> impl Future<Output=&i32> {
|
|
|
|
async move {
|
|
|
|
let y = &*x;
|
|
|
|
*x += 1; //~ ERROR cannot assign to `*x` because it is borrowed
|
|
|
|
y
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {}
|