Skip to content

Commit

Permalink
Auto merge of #30202 - oli-obk:fix/const_index_feature_gate, r=Aatch
Browse files Browse the repository at this point in the history
see #29947 (comment)

I also added some missing tests
  • Loading branch information
bors committed Dec 7, 2015
2 parents 7b77f67 + baa8ce7 commit 4dbdfb4
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 11 deletions.
4 changes: 3 additions & 1 deletion src/librustc/middle/check_const.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
13 changes: 4 additions & 9 deletions src/librustc/middle/const_eval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,8 @@ pub enum ErrKind {

MiscBinaryOp,
MiscCatchAll,

IndexOpFeatureGated,
}

impl ConstEvalErr {
Expand Down Expand Up @@ -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(),
}
}
}
Expand Down Expand Up @@ -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
Expand Down
15 changes: 15 additions & 0 deletions src/test/compile-fail/const-index-feature-gate.rs
Original file line number Diff line number Diff line change
@@ -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 <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.

const ARR: [usize; 1] = [2];
const ARR2: [i32; ARR[0]] = [5, 6]; //~ ERROR unstable

fn main() {
}
5 changes: 4 additions & 1 deletion src/test/compile-fail/lint-exceeding-bitshifts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
}
15 changes: 15 additions & 0 deletions src/test/run-pass/check_const-feature-gated.rs
Original file line number Diff line number Diff line change
@@ -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 <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.

const ARR: [usize; 1] = [2];

fn main() {
let _ = 5 << ARR[0];
}

0 comments on commit 4dbdfb4

Please sign in to comment.