diff options
| author | bors <bors@rust-lang.org> | 2018-04-02 18:14:09 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-04-02 18:14:09 +0000 |
| commit | 934902af61d8024ddd7db290b33a7076dad7b107 (patch) | |
| tree | 8e070daf866643f7c4115bd95594afadc1e5879a /src/libsyntax | |
| parent | 097efa9a998d4f3a4aee3af126e8f8a9eba1ae07 (diff) | |
| parent | 195c6b4789858b7fa23735a67facf2bd0749729b (diff) | |
| download | rust-934902af61d8024ddd7db290b33a7076dad7b107.tar.gz rust-934902af61d8024ddd7db290b33a7076dad7b107.zip | |
Auto merge of #49252 - Manishearth:easy-feature-flag, r=nikomatsakis
Easy edition feature flag We no longer gate features on epochs; instead we have a `#![feature(rust_2018_preview)]` that flips on a bunch of features (currently dyn_trait). Based on #49001 to avoid merge conflicts r? @nikomatsakis
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/edition.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 36 |
2 files changed, 30 insertions, 13 deletions
diff --git a/src/libsyntax/edition.rs b/src/libsyntax/edition.rs index 61246d4493c..e579fc74b42 100644 --- a/src/libsyntax/edition.rs +++ b/src/libsyntax/edition.rs @@ -55,6 +55,13 @@ impl Edition { Edition::Edition2018 => "edition_2018", } } + + pub fn feature_name(&self) -> &'static str { + match *self { + Edition::Edition2015 => "rust_2015_preview", + Edition::Edition2018 => "rust_2018_preview", + } + } } impl FromStr for Edition { diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 71609af803e..463e76e1461 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -28,7 +28,7 @@ use self::AttributeGate::*; use abi::Abi; use ast::{self, NodeId, PatKind, RangeEnd}; use attr; -use edition::Edition; +use edition::{ALL_EDITIONS, Edition}; use codemap::Spanned; use syntax_pos::{Span, DUMMY_SP}; use errors::{DiagnosticBuilder, Handler, FatalError}; @@ -1800,21 +1800,15 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { } pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute], - edition: Edition) -> Features { + crate_edition: Edition) -> Features { + fn feature_removed(span_handler: &Handler, span: Span) { + span_err!(span_handler, span, E0557, "feature has been removed"); + } + let mut features = Features::new(); let mut feature_checker = FeatureChecker::default(); - 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 - // lang features by edition - set(&mut features, DUMMY_SP); - } - } - } - for attr in krate_attrs { if !attr.check_name("feature") { continue @@ -1827,6 +1821,7 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute], } Some(list) => { for mi in list { + let name = if let Some(word) = mi.word() { word.name() } else { @@ -1844,11 +1839,26 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute], .find(|& &(n, _, _)| name == n) .or_else(|| STABLE_REMOVED_FEATURES.iter() .find(|& &(n, _, _)| name == n)) { - span_err!(span_handler, mi.span, E0557, "feature has been removed"); + feature_removed(span_handler, mi.span); } else if let Some(&(_, _, _)) = ACCEPTED_FEATURES.iter() .find(|& &(n, _, _)| name == n) { features.declared_stable_lang_features.push((name, mi.span)); + } else if let Some(&edition) = ALL_EDITIONS.iter() + .find(|e| name == e.feature_name()) { + if edition <= crate_edition { + feature_removed(span_handler, mi.span); + } else { + 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); + } + } + } + } } else { features.declared_lib_features.push((name, mi.span)); } |
