Rollup merge of #70364 - petrochenkov:nofrustc, r=Centril

resolve: Remove `rustc_attrs` as a standalone feature gate

Now it only gates specific built-in attributes.

So if you want to make a rustc attribute, make it a built-in (this was already the case in practice for some time).
This commit is contained in:
Mazdak Farrokhzad
2020-03-25 06:45:33 +01:00
committed by GitHub
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::{self, DefKind, NonMacroAttrKind};
use rustc_hir::def_id; use rustc_hir::def_id;
use rustc_session::lint::builtin::UNUSED_MACROS; use rustc_session::lint::builtin::UNUSED_MACROS;
use rustc_session::parse::feature_err;
use rustc_session::Session; use rustc_session::Session;
use rustc_span::edition::Edition; use rustc_span::edition::Edition;
use rustc_span::hygiene::{self, ExpnData, ExpnId, ExpnKind}; use rustc_span::hygiene::{self, ExpnData, ExpnId, ExpnKind};
@@ -397,20 +396,16 @@ impl<'a> Resolver<'a> {
Err(Determinacy::Undetermined) => return Err(Indeterminate), Err(Determinacy::Undetermined) => return Err(Indeterminate),
}; };
// Report errors and enforce feature gates for the resolved macro. // Report errors for the resolved macro.
let features = self.session.features_untracked();
for segment in &path.segments { for segment in &path.segments {
if let Some(args) = &segment.args { if let Some(args) = &segment.args {
self.session.span_err(args.span(), "generic arguments in macro path"); self.session.span_err(args.span(), "generic arguments in macro path");
} }
if kind == MacroKind::Attr if kind == MacroKind::Attr && segment.ident.as_str().starts_with("rustc") {
&& !features.rustc_attrs self.session.span_err(
&& segment.ident.as_str().starts_with("rustc") segment.ident.span,
{ "attributes starting with `rustc` are reserved for use by the `rustc` compiler",
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();
} }
} }

View File

@@ -2,19 +2,19 @@
#![feature(plugin_registrar, rustc_private)] #![feature(plugin_registrar, rustc_private)]
#![feature(box_syntax)] #![feature(box_syntax)]
extern crate rustc_driver; extern crate rustc_driver;
extern crate rustc_hir; extern crate rustc_hir;
extern crate rustc_span;
#[macro_use]
extern crate rustc_lint; extern crate rustc_lint;
extern crate rustc_span;
#[macro_use] #[macro_use]
extern crate rustc_session; extern crate rustc_session;
extern crate rustc_ast; extern crate rustc_ast;
use rustc_ast::attr;
use rustc_driver::plugin::Registry; use rustc_driver::plugin::Registry;
use rustc_lint::{LateContext, LateLintPass, LintContext, LintPass}; use rustc_lint::{LateContext, LateLintPass, LintContext, LintPass};
use rustc_span::symbol::Symbol; use rustc_span::symbol::Symbol;
use rustc_ast::attr;
macro_rules! fake_lint_pass { macro_rules! fake_lint_pass {
($struct:ident, $($attr:expr),*) => { ($struct:ident, $($attr:expr),*) => {
@@ -50,17 +50,17 @@ declare_lint!(CRATE_NOT_GREEN, Warn, "crate not marked with #![crate_green]");
fake_lint_pass! { fake_lint_pass! {
PassOkay, PassOkay,
Symbol::intern("rustc_crate_okay") Symbol::intern("crate_okay")
} }
fake_lint_pass! { fake_lint_pass! {
PassRedBlue, PassRedBlue,
Symbol::intern("rustc_crate_red"), Symbol::intern("rustc_crate_blue") Symbol::intern("crate_red"), Symbol::intern("crate_blue")
} }
fake_lint_pass! { fake_lint_pass! {
PassGreyGreen, PassGreyGreen,
Symbol::intern("rustc_crate_grey"), Symbol::intern("rustc_crate_green") Symbol::intern("crate_grey"), Symbol::intern("crate_green")
} }
#[plugin_registrar] #[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 // aux-build:lint-for-crate-rpass.rs
// ignore-stage1 // ignore-stage1
// compile-flags: -D crate-not-okay // compile-flags: -D crate-not-okay
#![feature(plugin, register_attr, custom_inner_attributes, rustc_attrs)] #![feature(plugin, register_attr, custom_inner_attributes)]
#![register_attr( #![register_attr(
rustc_crate_okay, crate_okay,
rustc_crate_blue, crate_blue,
rustc_crate_red, crate_red,
rustc_crate_grey, crate_grey,
rustc_crate_green, crate_green,
)] )]
#![plugin(lint_for_crate_rpass)] //~ WARNING compiler plugins are deprecated #![plugin(lint_for_crate_rpass)] //~ WARNING compiler plugins are deprecated
#![rustc_crate_okay] #![crate_okay]
#![rustc_crate_blue] #![crate_blue]
#![rustc_crate_red] #![crate_red]
#![rustc_crate_grey] #![crate_grey]
#![rustc_crate_green] #![crate_green]
fn main() {} 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 --> $DIR/feature-gate-rustc-attrs.rs:8:3
| |
LL | #[rustc::unknown] LL | #[rustc::unknown]
| ^^^^^ | ^^^^^
|
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
error: expected attribute, found macro `rustc::unknown` error: expected attribute, found macro `rustc::unknown`
--> $DIR/feature-gate-rustc-attrs.rs:8:3 --> $DIR/feature-gate-rustc-attrs.rs:8:3
@@ -12,13 +10,11 @@ error: expected attribute, found macro `rustc::unknown`
LL | #[rustc::unknown] LL | #[rustc::unknown]
| ^^^^^^^^^^^^^^ not an attribute | ^^^^^^^^^^^^^^ 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 --> $DIR/feature-gate-rustc-attrs.rs:13:12
| |
LL | #[unknown::rustc] LL | #[unknown::rustc]
| ^^^^^ | ^^^^^
|
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
error: expected attribute, found macro `unknown::rustc` error: expected attribute, found macro `unknown::rustc`
--> $DIR/feature-gate-rustc-attrs.rs:13:3 --> $DIR/feature-gate-rustc-attrs.rs:13:3
@@ -26,13 +22,11 @@ error: expected attribute, found macro `unknown::rustc`
LL | #[unknown::rustc] LL | #[unknown::rustc]
| ^^^^^^^^^^^^^^ not an attribute | ^^^^^^^^^^^^^^ 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 --> $DIR/feature-gate-rustc-attrs.rs:20:3
| |
LL | #[rustc_unknown] LL | #[rustc_unknown]
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
|
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
error: cannot find attribute `rustc_unknown` in this scope error: cannot find attribute `rustc_unknown` in this scope
--> $DIR/feature-gate-rustc-attrs.rs:20:3 --> $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 --> $DIR/expand-to-unstable-2.rs:10:10
| |
LL | #[derive(Unstable)] 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) = 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 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. // 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 { struct MyStruct {
number: i32 number: i32,
} }
trait TestTrait { trait TestTrait {
#[rustc_duplicate(TestType2)] #[duplicate(TestType2)]
type TestType; type TestType;
#[rustc_duplicate(required_fn2)] #[duplicate(required_fn2)]
fn required_fn(&self); fn required_fn(&self);
#[rustc_duplicate(provided_fn2)] #[duplicate(provided_fn2)]
fn provided_fn(&self) { } fn provided_fn(&self) {}
} }
impl TestTrait for MyStruct { impl TestTrait for MyStruct {
#[rustc_duplicate(TestType2)] #[duplicate(TestType2)]
type TestType = f64; type TestType = f64;
#[rustc_duplicate(required_fn2)] #[duplicate(required_fn2)]
fn required_fn(&self) { } fn required_fn(&self) {}
} }
fn main() { 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 --> $DIR/reserved-attr-on-macro.rs:1:3
| |
LL | #[rustc_attribute_should_be_reserved] 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` error: cannot determine resolution for the macro `foo`
--> $DIR/reserved-attr-on-macro.rs:10:5 --> $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 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 --> $DIR/attribute-typos.rs:11:3
| |
LL | #[rustc_err] LL | #[rustc_err]
| ^^^^^^^^^ | ^^^^^^^^^
|
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
error: cannot find attribute `rustc_err` in this scope error: cannot find attribute `rustc_err` in this scope
--> $DIR/attribute-typos.rs:11:3 --> $DIR/attribute-typos.rs:11:3
@@ -31,4 +29,3 @@ LL | #[deprcated]
error: aborting due to 4 previous errors error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0658`.