From 271777ce2214652bc75964c3b4953f08d0fdfbe2 Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Sat, 13 Feb 2016 15:12:58 -0500 Subject: [PATCH] Fix ICE on using result of index on a constant to index into a constant The issue was that the const evaluator was returning an error because the feature flag const_indexing wasn't turned on. The error was then reported as a bug. Fixes #29914 --- src/librustc_trans/trans/consts.rs | 14 ++++++-------- src/test/run-pass/issue-29914-2.rs | 15 +++++++++++++++ src/test/run-pass/issue-29914-3.rs | 16 ++++++++++++++++ src/test/run-pass/issue-29914.rs | 16 ++++++++++++++++ 4 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 src/test/run-pass/issue-29914-2.rs create mode 100644 src/test/run-pass/issue-29914-3.rs create mode 100644 src/test/run-pass/issue-29914.rs diff --git a/src/librustc_trans/trans/consts.rs b/src/librustc_trans/trans/consts.rs index 4f25091d343..e8c90fa31ea 100644 --- a/src/librustc_trans/trans/consts.rs +++ b/src/librustc_trans/trans/consts.rs @@ -24,8 +24,6 @@ use middle::const_eval::{const_int_checked_rem, const_uint_checked_rem}; use middle::const_eval::{const_int_checked_shl, const_uint_checked_shl}; use middle::const_eval::{const_int_checked_shr, const_uint_checked_shr}; -use middle::const_eval::EvalHint::ExprTypeChecked; -use middle::const_eval::eval_const_expr_partial; use middle::def::Def; use middle::def_id::DefId; use trans::{adt, closure, debuginfo, expr, inline, machine}; @@ -261,7 +259,7 @@ pub fn description(&self) -> Cow { } } -#[derive(Copy, Clone)] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum TrueConst { Yes, No } @@ -665,11 +663,11 @@ fn const_expr_unadjusted<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, }, hir::ExprIndex(ref base, ref index) => { let (bv, bt) = try!(const_expr(cx, &base, param_substs, fn_args, trueconst)); - let iv = match eval_const_expr_partial(cx.tcx(), &index, ExprTypeChecked, None) { - Ok(ConstVal::Int(i)) => i as u64, - Ok(ConstVal::Uint(u)) => u, - _ => cx.sess().span_bug(index.span, - "index is not an integer-constant expression") + let iv = try!(const_expr(cx, &index, param_substs, fn_args, TrueConst::Yes)).0; + let iv = if let Some(iv) = const_to_opt_uint(iv) { + iv + } else { + cx.sess().span_bug(index.span, "index is not an integer-constant expression"); }; let (arr, len) = match bt.sty { ty::TyArray(_, u) => (bv, C_uint(cx, u)), diff --git a/src/test/run-pass/issue-29914-2.rs b/src/test/run-pass/issue-29914-2.rs new file mode 100644 index 00000000000..fe0a6cf2880 --- /dev/null +++ b/src/test/run-pass/issue-29914-2.rs @@ -0,0 +1,15 @@ +// Copyright 2016 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. + +const ARR: [usize; 5] = [5, 4, 3, 2, 1]; + +fn main() { + assert_eq!(3, ARR[ARR[3]]); +} diff --git a/src/test/run-pass/issue-29914-3.rs b/src/test/run-pass/issue-29914-3.rs new file mode 100644 index 00000000000..3a02764164c --- /dev/null +++ b/src/test/run-pass/issue-29914-3.rs @@ -0,0 +1,16 @@ +// Copyright 2016 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. + +const ARR: [usize; 5] = [5, 4, 3, 2, 1]; +const BLA: usize = ARR[ARR[3]]; + +fn main() { + assert_eq!(3, BLA); +} diff --git a/src/test/run-pass/issue-29914.rs b/src/test/run-pass/issue-29914.rs new file mode 100644 index 00000000000..bb933f0e422 --- /dev/null +++ b/src/test/run-pass/issue-29914.rs @@ -0,0 +1,16 @@ +// Copyright 2016 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. +#![feature(const_indexing)] + +const ARR: [usize; 5] = [5, 4, 3, 2, 1]; + +fn main() { + assert_eq!(3, ARR[ARR[3]]); +} -- 2.44.0