Rollup merge of #66391 - estebank:if-else-async-ice, r=Centril

Do not ICE in `if` without `else` in `async fn`

Fix #66387.
This commit is contained in:
Yuki Okushi 2019-11-15 18:36:28 +09:00 committed by GitHub
commit c5b6dceb68
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 2 deletions

View file

@ -244,7 +244,13 @@ impl<'a, 'tcx> Visitor<'tcx> for InteriorVisitor<'a, 'tcx> {
// can be reborrowed without needing to spill to a temporary.
// If this were not the case, then we could conceivably have
// to create intermediate temporaries.)
let ty = self.fcx.tables.borrow().expr_ty(expr);
self.record(ty, scope, Some(expr), expr.span);
//
// The type table might not have information for this expression
// if it is in a malformed scope. (#66387)
if let Some(ty) = self.fcx.tables.borrow().expr_ty_opt(expr) {
self.record(ty, scope, Some(expr), expr.span);
} else {
self.fcx.tcx.sess.delay_span_bug(expr.span, "no type for node");
}
}
}

View file

@ -0,0 +1,10 @@
// edition:2018
async fn f() -> i32 {
if true { //~ ERROR if may be missing an else clause
return 0;
}
// An `if` block without `else` causes the type table not to have a type for this expr.
// Check that we do not unconditionally access the type table and we don't ICE.
}
fn main() {}

View file

@ -0,0 +1,16 @@
error[E0317]: if may be missing an else clause
--> $DIR/issue-66387-if-without-else.rs:3:5
|
LL | / if true {
LL | | return 0;
LL | | }
| |_____^ expected (), found i32
|
= note: expected type `()`
found type `i32`
= note: `if` expressions without `else` evaluate to `()`
= help: consider adding an `else` block that evaluates to the expected type
error: aborting due to previous error
For more information about this error, try `rustc --explain E0317`.