summaryrefslogtreecommitdiffstats
path: root/src/test/ui/generator/addassign-yield.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/generator/addassign-yield.rs')
-rw-r--r--src/test/ui/generator/addassign-yield.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/test/ui/generator/addassign-yield.rs b/src/test/ui/generator/addassign-yield.rs
new file mode 100644
index 000000000..66f22bf31
--- /dev/null
+++ b/src/test/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()
+}