@@ -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 } ;
@@ -1818,21 +1818,15 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
18181818}
18191819
18201820pub 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+
18221826 let mut features = Features :: new ( ) ;
18231827
18241828 let mut feature_checker = FeatureChecker :: default ( ) ;
18251829
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-
18361830 for attr in krate_attrs {
18371831 if !attr. check_name ( "feature" ) {
18381832 continue
@@ -1845,6 +1839,7 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
18451839 }
18461840 Some ( list) => {
18471841 for mi in list {
1842+
18481843 let name = if let Some ( word) = mi. word ( ) {
18491844 word. name ( )
18501845 } else {
@@ -1862,11 +1857,26 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
18621857 . find ( |& & ( n, _, _) | name == n)
18631858 . or_else ( || STABLE_REMOVED_FEATURES . iter ( )
18641859 . find ( |& & ( n, _, _) | name == n) ) {
1865- span_err ! ( span_handler, mi. span, E0557 , "feature has been removed" ) ;
1860+ feature_removed ( span_handler, mi. span ) ;
18661861 }
18671862 else if let Some ( & ( _, _, _) ) = ACCEPTED_FEATURES . iter ( )
18681863 . find ( |& & ( n, _, _) | name == n) {
18691864 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+ }
18701880 } else {
18711881 features. declared_lib_features . push ( ( name, mi. span ) ) ;
18721882 }
0 commit comments