From b70cc5380452676e4044ca289d177781d6b42035 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 21 Mar 2018 15:48:56 -0700 Subject: [PATCH 1/2] Add easy edition feature flag --- src/libsyntax/edition.rs | 7 +++++++ 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 61246d4493ca3..e579fc74b4266 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 69612054ae3da..be5ebcbd13a60 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}; @@ -1818,21 +1818,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 @@ -1845,6 +1839,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 { @@ -1862,11 +1857,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)); } From 195c6b4789858b7fa23735a67facf2bd0749729b Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 21 Mar 2018 15:49:42 -0700 Subject: [PATCH 2/2] Fix test --- src/test/run-pass/epoch-gate-feature.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/run-pass/epoch-gate-feature.rs b/src/test/run-pass/epoch-gate-feature.rs index f3d8f216e1132..e3cd1edd20987 100644 --- a/src/test/run-pass/epoch-gate-feature.rs +++ b/src/test/run-pass/epoch-gate-feature.rs @@ -11,7 +11,7 @@ // Checks if the correct registers are being used to pass arguments // when the sysv64 ABI is specified. -// compile-flags: -Zedition=2018 +#![feature(rust_2018_preview)] pub trait Foo {}