use self::AttributeType::*;
use self::AttributeGate::*;
+use rustc_data_structures::fx::FxHashMap;
use rustc_target::spec::abi::Abi;
use ast::{self, NodeId, PatKind, RangeEnd};
use attr;
let mut feature_checker = FeatureChecker::default();
- for &(.., f_edition, set) in ACTIVE_FEATURES.iter() {
+ let mut edition_enabled_features = FxHashMap();
+
+ for &(name, .., f_edition, set) in ACTIVE_FEATURES.iter() {
if let Some(f_edition) = f_edition {
if f_edition <= crate_edition {
set(&mut features, DUMMY_SP);
+ edition_enabled_features.insert(Symbol::intern(name), crate_edition);
}
}
}
continue
};
+ if let Some(edition) = ALL_EDITIONS.iter().find(|e| name == e.feature_name()) {
+ if *edition <= crate_edition {
+ continue
+ }
+
+ for &(name, .., f_edition, set) in ACTIVE_FEATURES.iter() {
+ if let Some(f_edition) = f_edition {
+ if f_edition <= *edition {
+ // FIXME(Manishearth) there is currently no way to set
+ // lib features by edition
+ set(&mut features, DUMMY_SP);
+ edition_enabled_features.insert(Symbol::intern(name), *edition);
+ }
+ }
+ }
+
+ continue
+ }
+
if let Some((.., set)) = ACTIVE_FEATURES.iter().find(|f| name == f.0) {
- set(&mut features, mi.span);
- feature_checker.collect(&features, mi.span);
- features.declared_lang_features.push((name, mi.span, None));
+ if let Some(edition) = edition_enabled_features.get(&name) {
+ struct_span_err!(
+ span_handler,
+ mi.span,
+ E0705,
+ "the feature `{}` is included in the Rust {} edition",
+ name,
+ edition,
+ ).emit();
+ } else {
+ set(&mut features, mi.span);
+ feature_checker.collect(&features, mi.span);
+ features.declared_lang_features.push((name, mi.span, None));
+ }
continue
}
continue
}
- if let Some(edition) = ALL_EDITIONS.iter().find(|e| name == e.feature_name()) {
- if *edition <= crate_edition {
- continue
- }
-
- for &(.., f_edition, set) in ACTIVE_FEATURES.iter() {
- if let Some(f_edition) = f_edition {
- if *edition >= f_edition {
- // FIXME(Manishearth) there is currently no way to set
- // lib features by edition
- set(&mut features, DUMMY_SP);
- }
- }
- }
-
- continue
- }
-
features.declared_lib_features.push((name, mi.span));
}
}
--- /dev/null
+// Copyright 2018 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.
+
+#![feature(rust_2018_preview)]
+#![feature(raw_identifiers)]
+//~^ ERROR the feature `raw_identifiers` is included in the Rust 2018 edition
+
+fn main() {
+ let foo = 0;
+ let bar = r#foo;
+}