Skip to content
Permalink
Browse files

Avoid ICE on return outside of fn with literal array

Do not ICE when encountering `enum E { A = return [0][0] }`.
  • Loading branch information...
estebank committed Sep 21, 2019
1 parent 22bc9e1 commit 2ae87ff59d1261d6295d82b0b29bc5440ada0b32
@@ -189,9 +189,23 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
if let hir::ExprKind::Index(ref base, ref index) = e.kind {
let mut tables = self.fcx.tables.borrow_mut();

// All valid indexing looks like this; might encounter non-valid indexes at this point
if let ty::Ref(_, base_ty, _) = tables.expr_ty_adjusted(&base).kind {
let index_ty = tables.expr_ty_adjusted(&index);
// All valid indexing looks like this; might encounter non-valid indexes at this point.
let base_ty = tables.expr_ty_adjusted_opt(&base).map(|t| &t.kind);
if base_ty.is_none() {
self.tcx().sess.delay_span_bug(e.span, &format!("bad base: `{:?}`", base));
return;
}
if let Some(ty::Ref(_, base_ty, _)) = base_ty {
let index_ty = match tables.expr_ty_adjusted_opt(&index) {
Some(t) => t,
None => {
self.tcx().sess.delay_span_bug(
e.span,
&format!("bad index {:?} for base: `{:?}`", index, base),
);
self.fcx.tcx.types.err
}
};
let index_ty = self.fcx.resolve_vars_if_possible(&index_ty);

if base_ty.builtin_index().is_some() && index_ty == self.fcx.tcx.types.usize {
@@ -0,0 +1,5 @@
enum Bug {
V1 = return [0][0] //~ERROR return statement outside of function body
}

fn main() {}
@@ -0,0 +1,9 @@
error[E0572]: return statement outside of function body
--> $DIR/issue-64620.rs:2:10
|
LL | V1 = return [0][0]
| ^^^^^^^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0572`.

0 comments on commit 2ae87ff

Please sign in to comment.
You can’t perform that action at this time.