rustc: Allow an edition's feature on that edition
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
This commit is contained in:
parent
bd441779ff
commit
2885632706
@ -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
|
||||
}
|
||||
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
|
||||
};
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
if let Some((.., set)) = ACTIVE_FEATURES.iter().find(|f| name == f.0) {
|
||||
set(&mut features, mi.span);
|
||||
feature_checker.collect(&features, mi.span);
|
||||
continue
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
16
src/test/compile-fail/edition-feature-ok.rs
Normal file
16
src/test/compile-fail/edition-feature-ok.rs
Normal file
@ -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() {}
|
Loading…
x
Reference in New Issue
Block a user