42 lines
1.1 KiB
Rust
42 lines
1.1 KiB
Rust
//@ 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 || {
|
|
//~^ ERROR lifetime may not live long enough
|
|
//~| ERROR temporary value dropped while borrowed
|
|
let y = &*x;
|
|
*x += 1; //~ ERROR cannot assign to `*x` because it is borrowed
|
|
y
|
|
})()
|
|
}
|
|
|
|
pub fn async_closure_explicit_return_type(x: &mut i32) -> impl Future<Output=&i32> {
|
|
(async move || -> &i32 {
|
|
//~^ ERROR lifetime may not live long enough
|
|
//~| ERROR temporary value dropped while borrowed
|
|
let y = &*x;
|
|
*x += 1; //~ ERROR cannot assign to `*x` because it is borrowed
|
|
y
|
|
})()
|
|
}
|
|
|
|
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() {}
|