From: Eduard-Mihai Burtescu Date: Wed, 15 Aug 2018 23:06:26 +0000 (+0300) Subject: syntax: process all edition features before other features. X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=0f009795171c7ea9977110e6aeebe72c67f559c7;p=rust.git syntax: process all edition features before other features. --- diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 56e69b9df9e..74db42ead7d 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -1923,7 +1923,7 @@ fn feature_removed(span_handler: &Handler, span: Span, reason: Option<&str>) { let mut features = Features::new(); let mut edition_enabled_features = FxHashMap(); - for &(name, .., f_edition, set) in ACTIVE_FEATURES.iter() { + for &(name, .., f_edition, set) in ACTIVE_FEATURES { if let Some(f_edition) = f_edition { if f_edition <= crate_edition { set(&mut features, DUMMY_SP); @@ -1932,6 +1932,8 @@ fn feature_removed(span_handler: &Handler, span: Span, reason: Option<&str>) { } } + // Process the edition umbrella feature-gates first, to ensure + // `edition_enabled_features` is completed before it's queried. for attr in krate_attrs { if !attr.check_name("feature") { continue @@ -1939,28 +1941,22 @@ fn feature_removed(span_handler: &Handler, span: Span, reason: Option<&str>) { let list = match attr.meta_item_list() { Some(list) => list, - None => { - span_err!(span_handler, attr.span, E0555, - "malformed feature attribute, expected #![feature(...)]"); - continue - } + None => continue, }; for mi in list { let name = if let Some(word) = mi.word() { word.name() } else { - span_err!(span_handler, mi.span, E0556, - "malformed feature, expected just one word"); continue }; if let Some(edition) = ALL_EDITIONS.iter().find(|e| name == e.feature_name()) { if *edition <= crate_edition { - continue + continue; } - for &(name, .., f_edition, set) in ACTIVE_FEATURES.iter() { + for &(name, .., f_edition, set) in ACTIVE_FEATURES { if let Some(f_edition) = f_edition { if f_edition <= *edition { // FIXME(Manishearth) there is currently no way to set @@ -1970,8 +1966,36 @@ fn feature_removed(span_handler: &Handler, span: Span, reason: Option<&str>) { } } } + } + } + } + + for attr in krate_attrs { + if !attr.check_name("feature") { + continue + } + + let list = match attr.meta_item_list() { + Some(list) => list, + None => { + span_err!(span_handler, attr.span, E0555, + "malformed feature attribute, expected #![feature(...)]"); + continue + } + }; + for mi in list { + let name = if let Some(word) = mi.word() { + word.name() + } else { + span_err!(span_handler, mi.span, E0556, + "malformed feature, expected just one word"); continue + }; + + if ALL_EDITIONS.iter().any(|e| name == e.feature_name()) { + // Handled in the separate loop above. + continue; } if let Some((.., set)) = ACTIVE_FEATURES.iter().find(|f| name == f.0) { diff --git a/src/test/ui/E0705.rs b/src/test/ui/E0705.rs index a0ce95e3e02..b5fd3cf35f2 100644 --- a/src/test/ui/E0705.rs +++ b/src/test/ui/E0705.rs @@ -10,9 +10,9 @@ // compile-pass -#![feature(rust_2018_preview)] #![feature(raw_identifiers)] //~^ WARN the feature `raw_identifiers` is included in the Rust 2018 edition +#![feature(rust_2018_preview)] fn main() { let foo = 0; diff --git a/src/test/ui/E0705.stderr b/src/test/ui/E0705.stderr index ebb8dd4975d..2aa3077e48c 100644 --- a/src/test/ui/E0705.stderr +++ b/src/test/ui/E0705.stderr @@ -1,5 +1,5 @@ warning[E0705]: the feature `raw_identifiers` is included in the Rust 2018 edition - --> $DIR/E0705.rs:14:12 + --> $DIR/E0705.rs:13:12 | LL | #![feature(raw_identifiers)] | ^^^^^^^^^^^^^^^