about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2021-02-17 20:44:00 -0800
committerEsteban Küber <esteban@kuber.com.ar>2021-02-17 20:44:00 -0800
commit3eb454aabe63fdf04155c6943fa13f25d840ea84 (patch)
tree1e7adc3345c1bc6492709632d0d076208e00551d
parent8fe989dd768f5dfdb0fc90933f3f74fa4579fefd (diff)
downloadrust-3eb454aabe63fdf04155c6943fa13f25d840ea84.tar.gz
rust-3eb454aabe63fdf04155c6943fa13f25d840ea84.zip
Do not ICE when evaluating locals' types of invalid `yield`
When a `yield` is outside of a generator, check its value regardless to
avoid an ICE while trying to get all locals' types in writeback.

Fix #78653.
-rw-r--r--compiler/rustc_typeck/src/check/expr.rs2
-rw-r--r--src/test/ui/generator/yield-outside-generator-issue-78653.rs7
-rw-r--r--src/test/ui/generator/yield-outside-generator-issue-78653.stderr21
3 files changed, 30 insertions, 0 deletions
diff --git a/compiler/rustc_typeck/src/check/expr.rs b/compiler/rustc_typeck/src/check/expr.rs
index fa09c26c800..32bf0ab7e85 100644
--- a/compiler/rustc_typeck/src/check/expr.rs
+++ b/compiler/rustc_typeck/src/check/expr.rs
@@ -2081,6 +2081,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
             }
             _ => {
                 self.tcx.sess.emit_err(YieldExprOutsideOfGenerator { span: expr.span });
+                // Avoid expressions without types during writeback (#78653).
+                self.check_expr(value);
                 self.tcx.mk_unit()
             }
         }
diff --git a/src/test/ui/generator/yield-outside-generator-issue-78653.rs b/src/test/ui/generator/yield-outside-generator-issue-78653.rs
new file mode 100644
index 00000000000..4e8050c81b0
--- /dev/null
+++ b/src/test/ui/generator/yield-outside-generator-issue-78653.rs
@@ -0,0 +1,7 @@
+#![feature(generators)]
+
+fn main() {
+    yield || for i in 0 { }
+    //~^ ERROR yield expression outside of generator literal
+    //~| ERROR `{integer}` is not an iterator
+}
diff --git a/src/test/ui/generator/yield-outside-generator-issue-78653.stderr b/src/test/ui/generator/yield-outside-generator-issue-78653.stderr
new file mode 100644
index 00000000000..f0c7cb0e5d5
--- /dev/null
+++ b/src/test/ui/generator/yield-outside-generator-issue-78653.stderr
@@ -0,0 +1,21 @@
+error[E0627]: yield expression outside of generator literal
+  --> $DIR/yield-outside-generator-issue-78653.rs:4:5
+   |
+LL |     yield || for i in 0 { }
+   |     ^^^^^^^^^^^^^^^^^^^^^^^
+
+error[E0277]: `{integer}` is not an iterator
+  --> $DIR/yield-outside-generator-issue-78653.rs:4:23
+   |
+LL |     yield || for i in 0 { }
+   |                       ^ `{integer}` is not an iterator
+   |
+   = help: the trait `Iterator` is not implemented for `{integer}`
+   = note: if you want to iterate between `start` until a value `end`, use the exclusive range syntax `start..end` or the inclusive range syntax `start..=end`
+   = note: required because of the requirements on the impl of `IntoIterator` for `{integer}`
+   = note: required by `into_iter`
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0277, E0627.
+For more information about an error, try `rustc --explain E0277`.