提交 934902af 编写于 作者: B bors

Auto merge of #49252 - Manishearth:easy-feature-flag, r=nikomatsakis

Easy edition feature flag

We no longer gate features on epochs; instead we have a `#![feature(rust_2018_preview)]` that flips on a bunch of features (currently dyn_trait).

Based on #49001 to avoid merge conflicts

r? @nikomatsakis
......@@ -55,6 +55,13 @@ pub fn lint_name(&self) -> &'static str {
Edition::Edition2018 => "edition_2018",
}
}
pub fn feature_name(&self) -> &'static str {
match *self {
Edition::Edition2015 => "rust_2015_preview",
Edition::Edition2018 => "rust_2018_preview",
}
}
}
impl FromStr for Edition {
......
......@@ -28,7 +28,7 @@
use abi::Abi;
use ast::{self, NodeId, PatKind, RangeEnd};
use attr;
use edition::Edition;
use edition::{ALL_EDITIONS, Edition};
use codemap::Spanned;
use syntax_pos::{Span, DUMMY_SP};
use errors::{DiagnosticBuilder, Handler, FatalError};
......@@ -1800,21 +1800,15 @@ fn visit_generic_param(&mut self, param: &'a ast::GenericParam) {
}
pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
edition: Edition) -> Features {
crate_edition: Edition) -> Features {
fn feature_removed(span_handler: &Handler, span: Span) {
span_err!(span_handler, span, E0557, "feature has been removed");
}
let mut features = Features::new();
let mut feature_checker = FeatureChecker::default();
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
// lang features by edition
set(&mut features, DUMMY_SP);
}
}
}
for attr in krate_attrs {
if !attr.check_name("feature") {
continue
......@@ -1827,6 +1821,7 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
}
Some(list) => {
for mi in list {
let name = if let Some(word) = mi.word() {
word.name()
} else {
......@@ -1844,11 +1839,26 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
.find(|& &(n, _, _)| name == n)
.or_else(|| STABLE_REMOVED_FEATURES.iter()
.find(|& &(n, _, _)| name == n)) {
span_err!(span_handler, mi.span, E0557, "feature has been removed");
feature_removed(span_handler, mi.span);
}
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);
} 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);
}
}
}
}
} else {
features.declared_lib_features.push((name, mi.span));
}
......
......@@ -11,7 +11,7 @@
// Checks if the correct registers are being used to pass arguments
// when the sysv64 ABI is specified.
// compile-flags: -Zedition=2018
#![feature(rust_2018_preview)]
pub trait Foo {}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册