// build-pass // edition:2018 // This test is derived from // https://github.com/rust-lang/rust/issues/72651#issuecomment-668720468 // This test demonstrates that, in `async fn g()`, // indeed a temporary borrow `y` from `x` is live // while `f().await` is being evaluated. // Thus, `&'_ u8` should be included in type signature // of the underlying coroutine. #![feature(if_let_guard)] async fn f() -> u8 { 1 } async fn foo() -> [bool; 10] { [false; 10] } pub async fn g(x: u8) { match x { y if f().await == y => (), _ => (), } } // #78366: check the reference to the binding is recorded even if the binding is not autorefed async fn h(x: usize) { match x { y if foo().await[y] => (), _ => (), } } async fn i(x: u8) { match x { y if f().await == y + 1 => (), _ => (), } } async fn j(x: u8) { match x { y if let (1, 42) = (f().await, y) => (), _ => (), } } fn main() { let _ = g(10); let _ = h(9); let _ = i(8); let _ = j(7); }