| //@ run-pass | 
 | // Regression test for broken MIR error (#61442) | 
 | // Due to the two possible evaluation orders for | 
 | // a '+=' expression (depending on whether or not the 'AddAssign' trait | 
 | // is being used), we were failing to account for all types that might | 
 | // possibly be live across a yield point. | 
 |  | 
 | #![feature(coroutines, stmt_expr_attributes)] | 
 |  | 
 | fn foo() { | 
 |     let _x = #[coroutine] static || { | 
 |         let mut s = String::new(); | 
 |         s += { yield; "" }; | 
 |     }; | 
 |  | 
 |     let _y = #[coroutine] static || { | 
 |         let x = &mut 0; | 
 |         *{ yield; x } += match String::new() { _ => 0 }; | 
 |     }; | 
 |  | 
 |     // Please don't ever actually write something like this | 
 |     let _z = #[coroutine] static || { | 
 |         let x = &mut 0; | 
 |         *{ | 
 |             let inner = &mut 1; | 
 |             *{ yield (); inner } += match String::new() { _ => 1}; | 
 |             yield; | 
 |             x | 
 |         } += match String::new() { _ => 2 }; | 
 |     }; | 
 | } | 
 |  | 
 | fn main() { | 
 |     foo() | 
 | } |