Rollup merge of #82245 - estebank:issue-78653, r=matthewjasper

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.
This commit is contained in:
Dylan DPC 2021-02-19 02:49:09 +01:00 committed by GitHub
commit c244546626
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 0 deletions

View File

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

View File

@ -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
}

View File

@ -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`.