resolve: Remove rustc_attrs as a standalone feature gate

Now it only gates specific built-in attributes
This commit is contained in:
Vadim Petrochenkov 2020-03-24 20:41:16 +03:00
parent 374ab25585
commit 1fa6be0358
10 changed files with 77 additions and 100 deletions

View File

@ -20,7 +20,6 @@ use rustc_feature::is_builtin_attr_name;
use rustc_hir::def::{self, DefKind, NonMacroAttrKind};
use rustc_hir::def_id;
use rustc_session::lint::builtin::UNUSED_MACROS;
use rustc_session::parse::feature_err;
use rustc_session::Session;
use rustc_span::edition::Edition;
use rustc_span::hygiene::{self, ExpnData, ExpnId, ExpnKind};
@ -397,20 +396,16 @@ impl<'a> Resolver<'a> {
Err(Determinacy::Undetermined) => return Err(Indeterminate),
};
// Report errors and enforce feature gates for the resolved macro.
let features = self.session.features_untracked();
// Report errors for the resolved macro.
for segment in &path.segments {
if let Some(args) = &segment.args {
self.session.span_err(args.span(), "generic arguments in macro path");
}
if kind == MacroKind::Attr
&& !features.rustc_attrs
&& segment.ident.as_str().starts_with("rustc")
{
let msg =
"attributes starting with `rustc` are reserved for use by the `rustc` compiler";
feature_err(&self.session.parse_sess, sym::rustc_attrs, segment.ident.span, msg)
.emit();
if kind == MacroKind::Attr && segment.ident.as_str().starts_with("rustc") {
self.session.span_err(
segment.ident.span,
"attributes starting with `rustc` are reserved for use by the `rustc` compiler",
);
}
}

View File

@ -2,19 +2,19 @@
#![feature(plugin_registrar, rustc_private)]
#![feature(box_syntax)]
extern crate rustc_driver;
extern crate rustc_hir;
extern crate rustc_span;
#[macro_use]
extern crate rustc_lint;
extern crate rustc_span;
#[macro_use]
extern crate rustc_session;
extern crate rustc_ast;
use rustc_ast::attr;
use rustc_driver::plugin::Registry;
use rustc_lint::{LateContext, LateLintPass, LintContext, LintPass};
use rustc_span::symbol::Symbol;
use rustc_ast::attr;
macro_rules! fake_lint_pass {
($struct:ident, $($attr:expr),*) => {
@ -50,17 +50,17 @@ declare_lint!(CRATE_NOT_GREEN, Warn, "crate not marked with #![crate_green]");
fake_lint_pass! {
PassOkay,
Symbol::intern("rustc_crate_okay")
Symbol::intern("crate_okay")
}
fake_lint_pass! {
PassRedBlue,
Symbol::intern("rustc_crate_red"), Symbol::intern("rustc_crate_blue")
Symbol::intern("crate_red"), Symbol::intern("crate_blue")
}
fake_lint_pass! {
PassGreyGreen,
Symbol::intern("rustc_crate_grey"), Symbol::intern("rustc_crate_green")
Symbol::intern("crate_grey"), Symbol::intern("crate_green")
}
#[plugin_registrar]

View File

@ -1,33 +0,0 @@
// force-host
// no-prefer-dynamic
#![crate_type = "proc-macro"]
#![feature(rustc_private)]
extern crate rustc_ast;
extern crate rustc;
extern crate rustc_driver;
extern crate proc_macro;
use proc_macro::{TokenTree, TokenStream};
#[proc_macro_attribute]
pub fn rustc_duplicate(attr: TokenStream, item: TokenStream) -> TokenStream {
let mut new_name = Some(attr.into_iter().nth(0).unwrap());
let mut encountered_idents = 0;
let input = item.to_string();
let ret = item.into_iter().map(move |token| match token {
TokenTree::Ident(_) if encountered_idents == 1 => {
encountered_idents += 1;
new_name.take().unwrap()
}
TokenTree::Ident(_) => {
encountered_idents += 1;
token
}
_ => token
}).collect::<TokenStream>();
let mut input_again = input.parse::<TokenStream>().unwrap();
input_again.extend(ret);
input_again
}

View File

@ -1,23 +1,23 @@
// run-pass
// check-pass
// aux-build:lint-for-crate-rpass.rs
// ignore-stage1
// compile-flags: -D crate-not-okay
#![feature(plugin, register_attr, custom_inner_attributes, rustc_attrs)]
#![feature(plugin, register_attr, custom_inner_attributes)]
#![register_attr(
rustc_crate_okay,
rustc_crate_blue,
rustc_crate_red,
rustc_crate_grey,
rustc_crate_green,
crate_okay,
crate_blue,
crate_red,
crate_grey,
crate_green,
)]
#![plugin(lint_for_crate_rpass)] //~ WARNING compiler plugins are deprecated
#![rustc_crate_okay]
#![rustc_crate_blue]
#![rustc_crate_red]
#![rustc_crate_grey]
#![rustc_crate_green]
#![crate_okay]
#![crate_blue]
#![crate_red]
#![crate_grey]
#![crate_green]
fn main() {}

View File

@ -1,10 +1,8 @@
error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler
error: attributes starting with `rustc` are reserved for use by the `rustc` compiler
--> $DIR/feature-gate-rustc-attrs.rs:8:3
|
LL | #[rustc::unknown]
| ^^^^^
|
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
error: expected attribute, found macro `rustc::unknown`
--> $DIR/feature-gate-rustc-attrs.rs:8:3
@ -12,13 +10,11 @@ error: expected attribute, found macro `rustc::unknown`
LL | #[rustc::unknown]
| ^^^^^^^^^^^^^^ not an attribute
error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler
error: attributes starting with `rustc` are reserved for use by the `rustc` compiler
--> $DIR/feature-gate-rustc-attrs.rs:13:12
|
LL | #[unknown::rustc]
| ^^^^^
|
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
error: expected attribute, found macro `unknown::rustc`
--> $DIR/feature-gate-rustc-attrs.rs:13:3
@ -26,13 +22,11 @@ error: expected attribute, found macro `unknown::rustc`
LL | #[unknown::rustc]
| ^^^^^^^^^^^^^^ not an attribute
error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler
error: attributes starting with `rustc` are reserved for use by the `rustc` compiler
--> $DIR/feature-gate-rustc-attrs.rs:20:3
|
LL | #[rustc_unknown]
| ^^^^^^^^^^^^^
|
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
error: cannot find attribute `rustc_unknown` in this scope
--> $DIR/feature-gate-rustc-attrs.rs:20:3

View File

@ -0,0 +1,32 @@
// force-host
// no-prefer-dynamic
#![deny(unused)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
use proc_macro::*;
#[proc_macro_attribute]
pub fn duplicate(attr: TokenStream, item: TokenStream) -> TokenStream {
let mut new_name = Some(attr.into_iter().nth(0).unwrap());
let mut encountered_idents = 0;
let input = item.to_string();
let ret = item
.into_iter()
.map(move |token| match token {
TokenTree::Ident(_) if encountered_idents == 1 => {
encountered_idents += 1;
new_name.take().unwrap()
}
TokenTree::Ident(_) => {
encountered_idents += 1;
token
}
_ => token,
})
.collect::<TokenStream>();
let mut input_again = input.parse::<TokenStream>().unwrap();
input_again.extend(ret);
input_again
}

View File

@ -1,12 +1,10 @@
error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler
error: attributes starting with `rustc` are reserved for use by the `rustc` compiler
--> $DIR/expand-to-unstable-2.rs:10:10
|
LL | #[derive(Unstable)]
| ^^^^^^^^
|
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to previous error
For more information about this error, try `rustc --explain E0658`.

View File

@ -1,36 +1,33 @@
// check-pass
// aux-build:macro-crate-test.rs
// ignore-stage1
#![feature(rustc_attrs)]
#[macro_use]
extern crate macro_crate_test;
// The duplicate macro will create a copy of the item with the given identifier.
#[rustc_duplicate(MyCopy)]
// check-pass
// aux-build:duplicate.rs
#[macro_use]
extern crate duplicate;
#[duplicate(MyCopy)]
struct MyStruct {
number: i32
number: i32,
}
trait TestTrait {
#[rustc_duplicate(TestType2)]
#[duplicate(TestType2)]
type TestType;
#[rustc_duplicate(required_fn2)]
#[duplicate(required_fn2)]
fn required_fn(&self);
#[rustc_duplicate(provided_fn2)]
fn provided_fn(&self) { }
#[duplicate(provided_fn2)]
fn provided_fn(&self) {}
}
impl TestTrait for MyStruct {
#[rustc_duplicate(TestType2)]
#[duplicate(TestType2)]
type TestType = f64;
#[rustc_duplicate(required_fn2)]
fn required_fn(&self) { }
#[duplicate(required_fn2)]
fn required_fn(&self) {}
}
fn main() {

View File

@ -1,10 +1,8 @@
error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler
error: attributes starting with `rustc` are reserved for use by the `rustc` compiler
--> $DIR/reserved-attr-on-macro.rs:1:3
|
LL | #[rustc_attribute_should_be_reserved]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
error: cannot determine resolution for the macro `foo`
--> $DIR/reserved-attr-on-macro.rs:10:5
@ -22,4 +20,3 @@ LL | #[rustc_attribute_should_be_reserved]
error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0658`.

View File

@ -1,10 +1,8 @@
error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler
error: attributes starting with `rustc` are reserved for use by the `rustc` compiler
--> $DIR/attribute-typos.rs:11:3
|
LL | #[rustc_err]
| ^^^^^^^^^
|
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
error: cannot find attribute `rustc_err` in this scope
--> $DIR/attribute-typos.rs:11:3
@ -31,4 +29,3 @@ LL | #[deprcated]
error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0658`.