diff --git a/src/librustc/middle/const_eval.rs b/src/librustc/middle/const_eval.rs index f0cfd900fd75a..974231be0edf8 100644 --- a/src/librustc/middle/const_eval.rs +++ b/src/librustc/middle/const_eval.rs @@ -1182,46 +1182,40 @@ pub fn eval_const_expr_partial<'tcx>(tcx: &ty::ctxt<'tcx>, }, hir::ExprTupField(ref base, index) => { let base_hint = ty_hint.erase_hint(); - if let Ok(c) = eval_const_expr_partial(tcx, base, base_hint, fn_args) { - if let Tuple(tup_id) = c { - if let hir::ExprTup(ref fields) = tcx.map.expect_expr(tup_id).node { - if index.node < fields.len() { - return eval_const_expr_partial(tcx, &fields[index.node], base_hint, fn_args) - } else { - signal!(e, TupleIndexOutOfBounds); - } + let c = try!(eval_const_expr_partial(tcx, base, base_hint, fn_args)); + if let Tuple(tup_id) = c { + if let hir::ExprTup(ref fields) = tcx.map.expect_expr(tup_id).node { + if index.node < fields.len() { + return eval_const_expr_partial(tcx, &fields[index.node], base_hint, fn_args) } else { - unreachable!() + signal!(e, TupleIndexOutOfBounds); } } else { - signal!(base, ExpectedConstTuple); + unreachable!() } } else { - signal!(base, NonConstPath) + signal!(base, ExpectedConstTuple); } } hir::ExprField(ref base, field_name) => { let base_hint = ty_hint.erase_hint(); // Get the base expression if it is a struct and it is constant - if let Ok(c) = eval_const_expr_partial(tcx, base, base_hint, fn_args) { - if let Struct(struct_id) = c { - if let hir::ExprStruct(_, ref fields, _) = tcx.map.expect_expr(struct_id).node { - // Check that the given field exists and evaluate it - // if the idents are compared run-pass/issue-19244 fails - if let Some(f) = fields.iter().find(|f| f.name.node - == field_name.node) { - return eval_const_expr_partial(tcx, &*f.expr, base_hint, fn_args) - } else { - signal!(e, MissingStructField); - } + let c = try!(eval_const_expr_partial(tcx, base, base_hint, fn_args)); + if let Struct(struct_id) = c { + if let hir::ExprStruct(_, ref fields, _) = tcx.map.expect_expr(struct_id).node { + // Check that the given field exists and evaluate it + // if the idents are compared run-pass/issue-19244 fails + if let Some(f) = fields.iter().find(|f| f.name.node + == field_name.node) { + return eval_const_expr_partial(tcx, &*f.expr, base_hint, fn_args) } else { - unreachable!() + signal!(e, MissingStructField); } } else { - signal!(base, ExpectedConstStruct); + unreachable!() } } else { - signal!(base, NonConstPath); + signal!(base, ExpectedConstStruct); } } _ => signal!(e, MiscCatchAll) diff --git a/src/test/compile-fail/const-tup-index-span.rs b/src/test/compile-fail/const-tup-index-span.rs new file mode 100644 index 0000000000000..8c607fc7e32b2 --- /dev/null +++ b/src/test/compile-fail/const-tup-index-span.rs @@ -0,0 +1,18 @@ +// Copyright 2015 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test spans of errors + +const TUP: (usize,) = 5 << 64; +//~^ ERROR: attempted left shift with overflow [E0250] +const ARR: [i32; TUP.0] = []; + +fn main() { +}