//@ compile-flags: --edition 2018 #![feature(try_blocks)] #[inline(never)] fn do_something_with(_x: T) {} // This test checks that borrows made and returned inside try blocks are properly constrained pub fn main() { { // Test that a borrow which *might* be returned still freezes its referent let mut i = 222; let x: Result<&i32, ()> = try { Err(())?; &i }; i = 0; //~ ERROR cannot assign to `i` because it is borrowed let _ = i; do_something_with(x); } { let x = String::new(); let _y: Result<(), ()> = try { Err(())?; ::std::mem::drop(x); }; println!("{}", x); //~ ERROR borrow of moved value: `x` } { // Test that a borrow which *might* be assigned to an outer variable still freezes // its referent let mut i = 222; let mut j = &-1; let _x: Result<(), ()> = try { Err(())?; j = &i; }; i = 0; //~ ERROR cannot assign to `i` because it is borrowed let _ = i; do_something_with(j); } }