about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc/middle/check_const.rs4
-rw-r--r--src/librustc/middle/const_eval.rs13
-rw-r--r--src/test/compile-fail/const-index-feature-gate.rs15
-rw-r--r--src/test/compile-fail/lint-exceeding-bitshifts.rs5
-rw-r--r--src/test/run-pass/check_const-feature-gated.rs15
5 files changed, 41 insertions, 11 deletions
diff --git a/src/librustc/middle/check_const.rs b/src/librustc/middle/check_const.rs
index e29cc04e65a..69d8dfc3613 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 7b1c38d86d2..ed412463b99 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 00000000000..09822e46cc1
--- /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 <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() {
+}
diff --git a/src/test/compile-fail/lint-exceeding-bitshifts.rs b/src/test/compile-fail/lint-exceeding-bitshifts.rs
index 160551b81cb..ce1406e8010 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 00000000000..ae27b76c747
--- /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 <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];
+}