@@ -28,7 +28,7 @@ use self::AttributeGate::*;
28
28
use abi:: Abi ;
29
29
use ast:: { self , NodeId , PatKind , RangeEnd } ;
30
30
use attr;
31
- use edition:: Edition ;
31
+ use edition:: { ALL_EDITIONS , Edition } ;
32
32
use codemap:: Spanned ;
33
33
use syntax_pos:: { Span , DUMMY_SP } ;
34
34
use errors:: { DiagnosticBuilder , Handler , FatalError } ;
@@ -1800,21 +1800,15 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
1800
1800
}
1801
1801
1802
1802
pub fn get_features ( span_handler : & Handler , krate_attrs : & [ ast:: Attribute ] ,
1803
- edition : Edition ) -> Features {
1803
+ crate_edition : Edition ) -> Features {
1804
+ fn feature_removed ( span_handler : & Handler , span : Span ) {
1805
+ span_err ! ( span_handler, span, E0557 , "feature has been removed" ) ;
1806
+ }
1807
+
1804
1808
let mut features = Features :: new ( ) ;
1805
1809
1806
1810
let mut feature_checker = FeatureChecker :: default ( ) ;
1807
1811
1808
- for & ( .., f_edition, set) in ACTIVE_FEATURES . iter ( ) {
1809
- if let Some ( f_edition) = f_edition {
1810
- if edition >= f_edition {
1811
- // FIXME(Manishearth) there is currently no way to set
1812
- // lang features by edition
1813
- set ( & mut features, DUMMY_SP ) ;
1814
- }
1815
- }
1816
- }
1817
-
1818
1812
for attr in krate_attrs {
1819
1813
if !attr. check_name ( "feature" ) {
1820
1814
continue
@@ -1827,6 +1821,7 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
1827
1821
}
1828
1822
Some ( list) => {
1829
1823
for mi in list {
1824
+
1830
1825
let name = if let Some ( word) = mi. word ( ) {
1831
1826
word. name ( )
1832
1827
} else {
@@ -1844,11 +1839,26 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
1844
1839
. find ( |& & ( n, _, _) | name == n)
1845
1840
. or_else ( || STABLE_REMOVED_FEATURES . iter ( )
1846
1841
. find ( |& & ( n, _, _) | name == n) ) {
1847
- span_err ! ( span_handler, mi. span, E0557 , "feature has been removed" ) ;
1842
+ feature_removed ( span_handler, mi. span ) ;
1848
1843
}
1849
1844
else if let Some ( & ( _, _, _) ) = ACCEPTED_FEATURES . iter ( )
1850
1845
. find ( |& & ( n, _, _) | name == n) {
1851
1846
features. declared_stable_lang_features . push ( ( name, mi. span ) ) ;
1847
+ } else if let Some ( & edition) = ALL_EDITIONS . iter ( )
1848
+ . find ( |e| name == e. feature_name ( ) ) {
1849
+ if edition <= crate_edition {
1850
+ feature_removed ( span_handler, mi. span ) ;
1851
+ } else {
1852
+ for & ( .., f_edition, set) in ACTIVE_FEATURES . iter ( ) {
1853
+ if let Some ( f_edition) = f_edition {
1854
+ if edition >= f_edition {
1855
+ // FIXME(Manishearth) there is currently no way to set
1856
+ // lib features by edition
1857
+ set ( & mut features, DUMMY_SP ) ;
1858
+ }
1859
+ }
1860
+ }
1861
+ }
1852
1862
} else {
1853
1863
features. declared_lib_features . push ( ( name, mi. span ) ) ;
1854
1864
}
0 commit comments