Skip to content

Commit

Permalink
Auto merge of rust-lang#49252 - Manishearth:easy-feature-flag, r=niko…
Browse files Browse the repository at this point in the history
…matsakis

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 rust-lang#49001 to avoid merge conflicts

r? @nikomatsakis
  • Loading branch information
bors committed Apr 2, 2018
2 parents 097efa9 + 195c6b4 commit 934902a
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 14 deletions.
7 changes: 7 additions & 0 deletions src/libsyntax/edition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,13 @@ impl Edition {
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 {
Expand Down
36 changes: 23 additions & 13 deletions src/libsyntax/feature_gate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use self::AttributeGate::*;
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};
Expand Down Expand Up @@ -1800,21 +1800,15 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
}

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
Expand All @@ -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 {
Expand All @@ -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));
}
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/epoch-gate-feature.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {}

Expand Down

0 comments on commit 934902a

Please sign in to comment.