about summary refs log tree commit diff
path: root/tests/ui/generator/addassign-yield.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/generator/addassign-yield.rs')
-rw-r--r--tests/ui/generator/addassign-yield.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/tests/ui/generator/addassign-yield.rs b/tests/ui/generator/addassign-yield.rs
new file mode 100644
index 00000000000..66f22bf31fc
--- /dev/null
+++ b/tests/ui/generator/addassign-yield.rs
@@ -0,0 +1,35 @@
+// 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(generators)]
+
+fn foo() {
+    let _x = static || {
+        let mut s = String::new();
+        s += { yield; "" };
+    };
+
+    let _y = static || {
+        let x = &mut 0;
+        *{ yield; x } += match String::new() { _ => 0 };
+    };
+
+    // Please don't ever actually write something like this
+    let _z = static || {
+        let x = &mut 0;
+        *{
+            let inner = &mut 1;
+            *{ yield (); inner } += match String::new() { _ => 1};
+            yield;
+            x
+        } += match String::new() { _ => 2 };
+    };
+}
+
+fn main() {
+    foo()
+}