diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs index 3cfae1686dfdf..e8e8da6733471 100644 --- a/src/librustc_interface/passes.rs +++ b/src/librustc_interface/passes.rs @@ -41,7 +41,6 @@ use syntax::mut_visit::MutVisitor; use syntax::parse::{self, PResult}; use syntax::util::node_count::NodeCounter; use syntax::symbol::Symbol; -use syntax::feature_gate::AttributeType; use syntax_pos::FileName; use syntax_ext; @@ -219,7 +218,6 @@ impl BoxedResolver { pub struct PluginInfo { syntax_exts: Vec, - attributes: Vec<(Symbol, AttributeType)>, } pub fn register_plugins<'a>( @@ -312,12 +310,9 @@ pub fn register_plugins<'a>( } *sess.plugin_llvm_passes.borrow_mut() = llvm_passes; - *sess.plugin_attributes.borrow_mut() = attributes.clone(); + *sess.plugin_attributes.borrow_mut() = attributes; - Ok((krate, PluginInfo { - syntax_exts, - attributes, - })) + Ok((krate, PluginInfo { syntax_exts })) } fn configure_and_expand_inner<'a>( @@ -329,7 +324,6 @@ fn configure_and_expand_inner<'a>( crate_loader: &'a mut CrateLoader<'a>, plugin_info: PluginInfo, ) -> Result<(ast::Crate, Resolver<'a>)> { - let attributes = plugin_info.attributes; time(sess, "pre ast expansion lint checks", || { lint::check_ast_crate( sess, @@ -522,7 +516,6 @@ fn configure_and_expand_inner<'a>( &krate, &sess.parse_sess, &sess.features_untracked(), - &attributes, sess.opts.unstable_features, ); }); diff --git a/src/libsyntax/feature_gate/check.rs b/src/libsyntax/feature_gate/check.rs index 5711b269ff092..ddf847ca3a34c 100644 --- a/src/libsyntax/feature_gate/check.rs +++ b/src/libsyntax/feature_gate/check.rs @@ -1,7 +1,7 @@ use super::{active::{ACTIVE_FEATURES, Features}, Feature, State as FeatureState}; use super::accepted::ACCEPTED_FEATURES; use super::removed::{REMOVED_FEATURES, STABLE_REMOVED_FEATURES}; -use super::builtin_attrs::{AttributeGate, AttributeType, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP}; +use super::builtin_attrs::{AttributeGate, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP}; use crate::ast::{ self, AssocTyConstraint, AssocTyConstraintKind, NodeId, GenericParam, GenericParamKind, @@ -33,9 +33,8 @@ pub enum Stability { } struct Context<'a> { - features: &'a Features, parse_sess: &'a ParseSess, - plugin_attributes: &'a [(Symbol, AttributeType)], + features: &'a Features, } macro_rules! gate_feature_fn { @@ -67,7 +66,6 @@ impl<'a> Context<'a> { &self, attr: &ast::Attribute, attr_info: Option<&BuiltinAttribute>, - is_macro: bool ) { debug!("check_attribute(attr = {:?})", attr); if let Some(&(name, ty, _template, ref gateage)) = attr_info { @@ -87,42 +85,15 @@ impl<'a> Context<'a> { } } debug!("check_attribute: {:?} is builtin, {:?}, {:?}", attr.path, ty, gateage); - return; - } else { - for segment in &attr.path.segments { - if segment.ident.as_str().starts_with("rustc") { - let msg = "attributes starting with `rustc` are \ - reserved for use by the `rustc` compiler"; - gate_feature!(self, rustc_attrs, segment.ident.span, msg); - } - } - } - for &(n, ty) in self.plugin_attributes { - if attr.path == n { - // Plugins can't gate attributes, so we don't check for it - // unlike the code above; we only use this loop to - // short-circuit to avoid the checks below. - debug!("check_attribute: {:?} is registered by a plugin, {:?}", attr.path, ty); - return; - } - } - if !is_macro && !attr::is_known(attr) { - // Only run the custom attribute lint during regular feature gate - // checking. Macro gating runs before the plugin attributes are - // registered, so we skip this in that case. - let msg = format!("the attribute `{}` is currently unknown to the compiler and \ - may have meaning added to it in the future", attr.path); - gate_feature!(self, custom_attribute, attr.span, &msg); } } } pub fn check_attribute(attr: &ast::Attribute, parse_sess: &ParseSess, features: &Features) { - let cx = Context { features, parse_sess, plugin_attributes: &[] }; + let cx = Context { parse_sess, features }; cx.check_attribute( attr, attr.ident().and_then(|ident| BUILTIN_ATTRIBUTE_MAP.get(&ident.name).map(|a| *a)), - true ); } @@ -321,7 +292,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { }); // Check for gated attributes. - self.context.check_attribute(attr, attr_info, false); + self.context.check_attribute(attr, attr_info); if attr.check_name(sym::doc) { if let Some(content) = attr.meta_item_list() { @@ -872,21 +843,16 @@ fn active_features_up_to(edition: Edition) -> impl Iterator { gate_all!($gate, $gate, $msg); }; ($spans:ident, $gate:ident, $msg:literal) => { - for span in &*sess.gated_spans.$spans.borrow() { + for span in &*parse_sess.gated_spans.$spans.borrow() { gate_feature!(&ctx, $gate, *span, $msg); } }