diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2021-02-17 20:44:00 -0800 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2021-02-17 20:44:00 -0800 |
| commit | 3eb454aabe63fdf04155c6943fa13f25d840ea84 (patch) | |
| tree | 1e7adc3345c1bc6492709632d0d076208e00551d | |
| parent | 8fe989dd768f5dfdb0fc90933f3f74fa4579fefd (diff) | |
| download | rust-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.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/generator/yield-outside-generator-issue-78653.rs | 7 | ||||
| -rw-r--r-- | src/test/ui/generator/yield-outside-generator-issue-78653.stderr | 21 |
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`. |
