@@ -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 } ;
@@ -1818,21 +1818,15 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
1818
1818
}
1819
1819
1820
1820
pub fn get_features ( span_handler : & Handler , krate_attrs : & [ ast:: Attribute ] ,
1821
- edition : Edition ) -> Features {
1821
+ crate_edition : Edition ) -> Features {
1822
+ fn feature_removed ( span_handler : & Handler , span : Span ) {
1823
+ span_err ! ( span_handler, span, E0557 , "feature has been removed" ) ;
1824
+ }
1825
+
1822
1826
let mut features = Features :: new ( ) ;
1823
1827
1824
1828
let mut feature_checker = FeatureChecker :: default ( ) ;
1825
1829
1826
- for & ( .., f_edition, set) in ACTIVE_FEATURES . iter ( ) {
1827
- if let Some ( f_edition) = f_edition {
1828
- if edition >= f_edition {
1829
- // FIXME(Manishearth) there is currently no way to set
1830
- // lang features by edition
1831
- set ( & mut features, DUMMY_SP ) ;
1832
- }
1833
- }
1834
- }
1835
-
1836
1830
for attr in krate_attrs {
1837
1831
if !attr. check_name ( "feature" ) {
1838
1832
continue
@@ -1845,6 +1839,7 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
1845
1839
}
1846
1840
Some ( list) => {
1847
1841
for mi in list {
1842
+
1848
1843
let name = if let Some ( word) = mi. word ( ) {
1849
1844
word. name ( )
1850
1845
} else {
@@ -1862,11 +1857,26 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
1862
1857
. find ( |& & ( n, _, _) | name == n)
1863
1858
. or_else ( || STABLE_REMOVED_FEATURES . iter ( )
1864
1859
. find ( |& & ( n, _, _) | name == n) ) {
1865
- span_err ! ( span_handler, mi. span, E0557 , "feature has been removed" ) ;
1860
+ feature_removed ( span_handler, mi. span ) ;
1866
1861
}
1867
1862
else if let Some ( & ( _, _, _) ) = ACCEPTED_FEATURES . iter ( )
1868
1863
. find ( |& & ( n, _, _) | name == n) {
1869
1864
features. declared_stable_lang_features . push ( ( name, mi. span ) ) ;
1865
+ } else if let Some ( & edition) = ALL_EDITIONS . iter ( )
1866
+ . find ( |e| name == e. feature_name ( ) ) {
1867
+ if edition <= crate_edition {
1868
+ feature_removed ( span_handler, mi. span ) ;
1869
+ } else {
1870
+ for & ( .., f_edition, set) in ACTIVE_FEATURES . iter ( ) {
1871
+ if let Some ( f_edition) = f_edition {
1872
+ if edition >= f_edition {
1873
+ // FIXME(Manishearth) there is currently no way to set
1874
+ // lib features by edition
1875
+ set ( & mut features, DUMMY_SP ) ;
1876
+ }
1877
+ }
1878
+ }
1879
+ }
1870
1880
} else {
1871
1881
features. declared_lib_features . push ( ( name, mi. span ) ) ;
1872
1882
}
0 commit comments