@@ -28,7 +28,7 @@ use self::AttributeGate::*;
2828use abi:: Abi ;
2929use ast:: { self , NodeId , PatKind , RangeEnd } ;
3030use attr;
31- use edition:: Edition ;
31+ use edition:: { ALL_EDITIONS , Edition } ;
3232use codemap:: Spanned ;
3333use syntax_pos:: { Span , DUMMY_SP } ;
3434use errors:: { DiagnosticBuilder , Handler , FatalError } ;
@@ -1800,21 +1800,15 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
18001800}
18011801
18021802pub 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+
18041808 let mut features = Features :: new ( ) ;
18051809
18061810 let mut feature_checker = FeatureChecker :: default ( ) ;
18071811
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-
18181812 for attr in krate_attrs {
18191813 if !attr. check_name ( "feature" ) {
18201814 continue
@@ -1827,6 +1821,7 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
18271821 }
18281822 Some ( list) => {
18291823 for mi in list {
1824+
18301825 let name = if let Some ( word) = mi. word ( ) {
18311826 word. name ( )
18321827 } else {
@@ -1844,11 +1839,26 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
18441839 . find ( |& & ( n, _, _) | name == n)
18451840 . or_else ( || STABLE_REMOVED_FEATURES . iter ( )
18461841 . find ( |& & ( n, _, _) | name == n) ) {
1847- span_err ! ( span_handler, mi. span, E0557 , "feature has been removed" ) ;
1842+ feature_removed ( span_handler, mi. span ) ;
18481843 }
18491844 else if let Some ( & ( _, _, _) ) = ACCEPTED_FEATURES . iter ( )
18501845 . find ( |& & ( n, _, _) | name == n) {
18511846 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+ }
18521862 } else {
18531863 features. declared_lib_features . push ( ( name, mi. span ) ) ;
18541864 }
0 commit comments