hir::ExprTup(_) => Tuple(e.id),
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)
+ }
let arr_hint = if let ExprTypeChecked = ty_hint {
ExprTypeChecked
} else {
// Allows the definition of `const fn` functions.
("const_fn", "1.2.0", Some(24111), Active),
+ // Allows indexing into constant arrays.
+ ("const_indexing", "1.4.0", Some(29947), Active),
+
// Allows using #[prelude_import] on glob `use` items.
//
// rustc internal
/// #![feature] attrs for non-language (library) features
pub declared_lib_features: Vec<(InternedString, Span)>,
pub const_fn: bool,
+ pub const_indexing: bool,
pub static_recursion: bool,
pub default_type_parameter_fallback: bool,
pub type_macros: bool,
declared_stable_lang_features: Vec::new(),
declared_lib_features: Vec::new(),
const_fn: false,
+ const_indexing: false,
static_recursion: false,
default_type_parameter_fallback: false,
type_macros: false,
declared_stable_lang_features: accepted_features,
declared_lib_features: unknown_features,
const_fn: cx.has_feature("const_fn"),
+ const_indexing: cx.has_feature("const_indexing"),
static_recursion: cx.has_feature("static_recursion"),
default_type_parameter_fallback: cx.has_feature("default_type_parameter_fallback"),
type_macros: cx.has_feature("type_macros"),
// option. This file may not be copied, modified, or distributed
// except according to those terms.
+#![feature(const_indexing)]
+
const ARR: [i32; 6] = [42, 43, 44, 45, 46, 47];
const IDX: usize = 3;
const VAL: i32 = ARR[IDX];
// option. This file may not be copied, modified, or distributed
// except according to those terms.
+#![feature(const_indexing)]
+
const FOO: [u32; 3] = [1, 2, 3];
const BAR: u32 = FOO[5]; // no error, because the error below occurs before regular const eval
// option. This file may not be copied, modified, or distributed
// except according to those terms.
+#![feature(const_indexing)]
fn main() {
const ARR: [i32; 6] = [42, 43, 44, 45, 46, 47];