Fix never-type rvalue ICE

This commit is contained in:
varkor 2018-01-25 18:03:48 +00:00
parent da569fa9dd
commit 6461532afa
3 changed files with 54 additions and 2 deletions

View file

@ -143,7 +143,13 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
if let Some(expr) = expr {
unpack!(block = this.into(destination, block, expr));
} else {
this.cfg.push_assign_unit(block, source_info, destination);
let tcx = this.hir.tcx();
let ty = destination.ty(&this.local_decls, tcx).to_ty(tcx);
if ty.is_nil() {
// We only want to assign an implicit `()` as the return value of the block if the
// block does not diverge. (Otherwise, we may try to assign a unit to a `!`-type.)
this.cfg.push_assign_unit(block, source_info, destination);
}
}
// Finally, we pop all the let scopes before exiting out from the scope of block
// itself.

View file

@ -272,7 +272,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
ExprKind::Continue { .. } |
ExprKind::Break { .. } |
ExprKind::InlineAsm { .. } |
ExprKind::Return {.. } => {
ExprKind::Return { .. } => {
unpack!(block = this.stmt_expr(block, expr));
this.cfg.push_assign_unit(block, source_info, destination);
block.unit()

View file

@ -0,0 +1,46 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(never_type)]
#![allow(dead_code)]
#![allow(path_statements)]
#![allow(unreachable_patterns)]
fn never_direct(x: !) {
x;
}
fn never_ref_pat(ref x: !) {
*x;
}
fn never_ref(x: &!) {
let &y = x;
y;
}
fn never_pointer(x: *const !) {
unsafe {
*x;
}
}
fn never_slice(x: &[!]) {
x[0];
}
fn never_match(x: Result<(), !>) {
match x {
Ok(_) => {},
Err(_) => {},
}
}
pub fn main() { }