From baa8ce7efdb84022809644c0bd5fed8ef476829e Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Fri, 4 Dec 2015 15:35:07 +0100 Subject: [PATCH] fix const index feature-gate regression --- src/librustc/middle/check_const.rs | 4 +++- src/librustc/middle/const_eval.rs | 13 ++++--------- src/test/compile-fail/const-index-feature-gate.rs | 15 +++++++++++++++ src/test/compile-fail/lint-exceeding-bitshifts.rs | 5 ++++- src/test/run-pass/check_const-feature-gated.rs | 15 +++++++++++++++ 5 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 src/test/compile-fail/const-index-feature-gate.rs create mode 100644 src/test/run-pass/check_const-feature-gated.rs diff --git a/src/librustc/middle/check_const.rs b/src/librustc/middle/check_const.rs index e29cc04e65a1b..69d8dfc361328 100644 --- a/src/librustc/middle/check_const.rs +++ b/src/librustc/middle/check_const.rs @@ -25,7 +25,8 @@ // by borrowck::gather_loans use middle::ty::cast::{CastKind}; -use middle::const_eval; +use middle::const_eval::{self, ConstEvalErr}; +use middle::const_eval::ErrKind::IndexOpFeatureGated; use middle::const_eval::EvalHint::ExprTypeChecked; use middle::def; use middle::def_id::DefId; @@ -477,6 +478,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for CheckCrateVisitor<'a, 'tcx> { match const_eval::eval_const_expr_partial( self.tcx, ex, ExprTypeChecked, None) { Ok(_) => {} + Err(ConstEvalErr { kind: IndexOpFeatureGated, ..}) => {}, Err(msg) => { self.tcx.sess.add_lint(::lint::builtin::CONST_ERR, ex.id, msg.span, diff --git a/src/librustc/middle/const_eval.rs b/src/librustc/middle/const_eval.rs index 7b1c38d86d2d2..ed412463b99e1 100644 --- a/src/librustc/middle/const_eval.rs +++ b/src/librustc/middle/const_eval.rs @@ -434,6 +434,8 @@ pub enum ErrKind { MiscBinaryOp, MiscCatchAll, + + IndexOpFeatureGated, } impl ConstEvalErr { @@ -483,6 +485,7 @@ impl ConstEvalErr { MiscBinaryOp => "bad operands for binary".into_cow(), MiscCatchAll => "unsupported constant expr".into_cow(), + IndexOpFeatureGated => "the index operation on const values is unstable".into_cow(), } } } @@ -1119,15 +1122,7 @@ pub fn eval_const_expr_partial<'tcx>(tcx: &ty::ctxt<'tcx>, hir::ExprStruct(..) => Struct(e.id), hir::ExprIndex(ref arr, ref idx) => { if !tcx.sess.features.borrow().const_indexing { - tcx.sess.span_err( - e.span, - "const indexing is an unstable feature"); - fileline_help!( - tcx.sess, - e.span, - "in Nightly builds, add `#![feature(const_indexing)]` to the crate \ - attributes to enable"); - signal!(e, NonConstPath) + signal!(e, IndexOpFeatureGated); } let arr_hint = if let ExprTypeChecked = ty_hint { ExprTypeChecked diff --git a/src/test/compile-fail/const-index-feature-gate.rs b/src/test/compile-fail/const-index-feature-gate.rs new file mode 100644 index 0000000000000..09822e46cc1ab --- /dev/null +++ b/src/test/compile-fail/const-index-feature-gate.rs @@ -0,0 +1,15 @@ +// 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. + +const ARR: [usize; 1] = [2]; +const ARR2: [i32; ARR[0]] = [5, 6]; //~ ERROR unstable + +fn main() { +} diff --git a/src/test/compile-fail/lint-exceeding-bitshifts.rs b/src/test/compile-fail/lint-exceeding-bitshifts.rs index 160551b81cb2e..ce1406e80100b 100644 --- a/src/test/compile-fail/lint-exceeding-bitshifts.rs +++ b/src/test/compile-fail/lint-exceeding-bitshifts.rs @@ -11,7 +11,7 @@ #![deny(exceeding_bitshifts)] #![allow(unused_variables)] #![allow(dead_code)] -#![feature(num_bits_bytes)] +#![feature(num_bits_bytes, const_indexing)] fn main() { let n = 1u8 << 7; @@ -62,4 +62,7 @@ fn main() { let n = 1i8<<(1isize+-1); + + let n = 1i64 >> [63][0]; + let n = 1i64 >> [64][0]; //~ ERROR: bitshift exceeds the type's number of bits } diff --git a/src/test/run-pass/check_const-feature-gated.rs b/src/test/run-pass/check_const-feature-gated.rs new file mode 100644 index 0000000000000..ae27b76c747e6 --- /dev/null +++ b/src/test/run-pass/check_const-feature-gated.rs @@ -0,0 +1,15 @@ +// 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. + +const ARR: [usize; 1] = [2]; + +fn main() { + let _ = 5 << ARR[0]; +}