| //@ 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() | |
| } |