Skip to content

Commit

Permalink
rustc: Allow an edition's feature on that edition
Browse files Browse the repository at this point in the history
This commit fixes a hard error where the `#![feature(rust_2018_preview)]`
feature was forbidden to be mentioned when the `--edition 2018` flag was passed.
This instead silently accepts that feature gate despite it not being necessary.
It's intended that this will help ease the transition into the 2018 edition as
users will, for the time being, start off with the `rust_2018_preview` feature
and no longer immediately need to remove it.

Closes #50662
  • Loading branch information
alexcrichton committed May 11, 2018
1 parent fe63e47 commit 0588bca
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 41 deletions.
87 changes: 46 additions & 41 deletions src/libsyntax/feature_gate.rs
Expand Up @@ -1861,56 +1861,61 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
continue
}

match attr.meta_item_list() {
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 let Some((.., set)) = ACTIVE_FEATURES.iter().find(|f| name == f.0) {
set(&mut features, mi.span);
feature_checker.collect(&features, mi.span);
continue
}
Some(list) => {
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(&(_, _, _, _, set)) = ACTIVE_FEATURES.iter()
.find(|& &(n, ..)| name == n) {
set(&mut features, mi.span);
feature_checker.collect(&features, mi.span);
}
else if let Some(&(.., reason)) = REMOVED_FEATURES.iter()
.find(|& &(n, ..)| name == n)
.or_else(|| STABLE_REMOVED_FEATURES.iter()
.find(|& &(n, ..)| name == n)) {
feature_removed(span_handler, mi.span, reason);
}
else if let Some(&(..)) = ACCEPTED_FEATURES.iter()
.find(|& &(n, ..)| name == n) {
features.declared_stable_lang_features.push((name, mi.span));
} else if let Some(&edition) = ALL_EDITIONS.iter()
.find(|e| name == e.feature_name()) {
if edition <= crate_edition {
feature_removed(span_handler, mi.span, None);
} else {
for &(.., f_edition, set) in ACTIVE_FEATURES.iter() {
if let Some(f_edition) = f_edition {
if edition >= f_edition {
// FIXME(Manishearth) there is currently no way to set
// lib features by edition
set(&mut features, DUMMY_SP);
}
}
}
let removed = REMOVED_FEATURES.iter().find(|f| name == f.0);
let stable_removed = STABLE_REMOVED_FEATURES.iter().find(|f| name == f.0);
if let Some((.., reason)) = removed.or(stable_removed) {
feature_removed(span_handler, mi.span, *reason);
continue
}

if ACCEPTED_FEATURES.iter().any(|f| name == f.0) {
features.declared_stable_lang_features.push((name, mi.span));
continue
}

if let Some(edition) = ALL_EDITIONS.iter().find(|e| name == e.feature_name()) {
if *edition <= crate_edition {
continue
}

for &(.., f_edition, set) in ACTIVE_FEATURES.iter() {
if let Some(f_edition) = f_edition {
if *edition >= f_edition {
// FIXME(Manishearth) there is currently no way to set
// lib features by edition
set(&mut features, DUMMY_SP);
}
} else {
features.declared_lib_features.push((name, mi.span));
}
}

continue
}

features.declared_lib_features.push((name, mi.span));
}
}

Expand Down
16 changes: 16 additions & 0 deletions src/test/compile-fail/edition-feature-ok.rs
@@ -0,0 +1,16 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// compile-flags:--edition 2018
// compile-pass

#![feature(rust_2018_preview)]

fn main() {}

0 comments on commit 0588bca

Please sign in to comment.