]> git.lizzy.rs Git - rust.git/commitdiff
syntax: process all edition features before other features.
authorEduard-Mihai Burtescu <edy.burt@gmail.com>
Wed, 15 Aug 2018 23:06:26 +0000 (02:06 +0300)
committerEduard-Mihai Burtescu <edy.burt@gmail.com>
Wed, 15 Aug 2018 23:49:56 +0000 (02:49 +0300)
src/libsyntax/feature_gate.rs
src/test/ui/E0705.rs
src/test/ui/E0705.stderr

index 56e69b9df9e0407c1d68715b420b1590da17c71b..74db42ead7d41300bf178f96cbe16f39a303d6aa 100644 (file)
@@ -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) {
index a0ce95e3e02c1ad1f4f45395cccc41b135902144..b5fd3cf35f28bedd306e13813b6ed3a1a1a2a261 100644 (file)
@@ -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;
index ebb8dd4975d6f101aa15f8b23f111fce301e49d6..2aa3077e48c2dad6ffa3d56be088b875f2f4492e 100644 (file)
@@ -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)]
    |            ^^^^^^^^^^^^^^^