mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Feature gate rustc
attributes harder
This commit is contained in:
parent
0ffb6438a6
commit
e4e7eb2d58
@ -19,9 +19,8 @@ use syntax::ext::base::{MacroKind, SyntaxExtension};
|
|||||||
use syntax::ext::expand::{AstFragment, Invocation, InvocationKind};
|
use syntax::ext::expand::{AstFragment, Invocation, InvocationKind};
|
||||||
use syntax::ext::hygiene::Mark;
|
use syntax::ext::hygiene::Mark;
|
||||||
use syntax::ext::tt::macro_rules;
|
use syntax::ext::tt::macro_rules;
|
||||||
use syntax::feature_gate::{
|
use syntax::feature_gate::{feature_err, emit_feature_err, is_builtin_attr_name};
|
||||||
feature_err, is_builtin_attr_name, AttributeGate, GateIssue, Stability, BUILTIN_ATTRIBUTES,
|
use syntax::feature_gate::{AttributeGate, GateIssue, Stability, BUILTIN_ATTRIBUTES};
|
||||||
};
|
|
||||||
use syntax::symbol::{Symbol, kw, sym};
|
use syntax::symbol::{Symbol, kw, sym};
|
||||||
use syntax::visit::Visitor;
|
use syntax::visit::Visitor;
|
||||||
use syntax::util::lev_distance::find_best_match_for_name;
|
use syntax::util::lev_distance::find_best_match_for_name;
|
||||||
@ -298,12 +297,25 @@ impl<'a> Resolver<'a> {
|
|||||||
let res = self.resolve_macro_to_res_inner(path, kind, parent_scope, trace, force);
|
let res = self.resolve_macro_to_res_inner(path, kind, parent_scope, trace, force);
|
||||||
|
|
||||||
// Report errors and enforce feature gates for the resolved macro.
|
// Report errors and enforce feature gates for the resolved macro.
|
||||||
|
let features = self.session.features_untracked();
|
||||||
if res != Err(Determinacy::Undetermined) {
|
if res != Err(Determinacy::Undetermined) {
|
||||||
// Do not report duplicated errors on every undetermined resolution.
|
// Do not report duplicated errors on every undetermined resolution.
|
||||||
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 && !features.rustc_attrs &&
|
||||||
|
segment.ident.as_str().starts_with("rustc") {
|
||||||
|
let msg = "attributes starting with `rustc` are \
|
||||||
|
reserved for use by the `rustc` compiler";
|
||||||
|
emit_feature_err(
|
||||||
|
&self.session.parse_sess,
|
||||||
|
sym::rustc_attrs,
|
||||||
|
segment.ident.span,
|
||||||
|
GateIssue::Language,
|
||||||
|
msg,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,7 +332,6 @@ impl<'a> Resolver<'a> {
|
|||||||
}
|
}
|
||||||
Res::NonMacroAttr(attr_kind) => {
|
Res::NonMacroAttr(attr_kind) => {
|
||||||
if kind == MacroKind::Attr {
|
if kind == MacroKind::Attr {
|
||||||
let features = self.session.features_untracked();
|
|
||||||
if attr_kind == NonMacroAttrKind::Custom {
|
if attr_kind == NonMacroAttrKind::Custom {
|
||||||
assert!(path.segments.len() == 1);
|
assert!(path.segments.len() == 1);
|
||||||
if !features.custom_attribute {
|
if !features.custom_attribute {
|
||||||
|
@ -1669,6 +1669,14 @@ impl<'a> Context<'a> {
|
|||||||
}
|
}
|
||||||
debug!("check_attribute: {:?} is builtin, {:?}, {:?}", attr.path, ty, gateage);
|
debug!("check_attribute: {:?} is builtin, {:?}, {:?}", attr.path, ty, gateage);
|
||||||
return;
|
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 {
|
for &(n, ty) in self.plugin_attributes {
|
||||||
if attr.path == n {
|
if attr.path == n {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// ignore-stage1
|
// ignore-stage1
|
||||||
// compile-flags: -D crate-not-okay
|
// compile-flags: -D crate-not-okay
|
||||||
|
|
||||||
#![feature(plugin, custom_attribute, custom_inner_attributes)]
|
#![feature(plugin, custom_attribute, custom_inner_attributes, rustc_attrs)]
|
||||||
|
|
||||||
#![plugin(lint_for_crate)]
|
#![plugin(lint_for_crate)]
|
||||||
#![rustc_crate_okay]
|
#![rustc_crate_okay]
|
||||||
|
@ -1,6 +1,23 @@
|
|||||||
// Test that `#[rustc_*]` attributes are gated by `rustc_attrs` feature gate.
|
// Test that `#[rustc_*]` attributes are gated by `rustc_attrs` feature gate.
|
||||||
|
|
||||||
|
#![feature(decl_macro)]
|
||||||
|
|
||||||
|
mod rustc { pub macro unknown() {} }
|
||||||
|
mod unknown { pub macro rustc() {} }
|
||||||
|
|
||||||
|
#[rustc::unknown]
|
||||||
|
//~^ ERROR attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||||
|
//~| ERROR macro `rustc::unknown` may not be used in attributes
|
||||||
|
fn f() {}
|
||||||
|
|
||||||
|
#[unknown::rustc]
|
||||||
|
//~^ ERROR attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||||
|
//~| ERROR macro `unknown::rustc` may not be used in attributes
|
||||||
|
fn g() {}
|
||||||
|
|
||||||
#[rustc_dummy]
|
#[rustc_dummy]
|
||||||
//~^ ERROR used by the test suite
|
//~^ ERROR used by the test suite
|
||||||
|
#[rustc_unknown]
|
||||||
|
//~^ ERROR attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||||
|
//~| ERROR attribute `rustc_unknown` is currently unknown
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,5 +1,53 @@
|
|||||||
|
error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||||
|
--> $DIR/feature-gate-rustc-attrs.rs:8:3
|
||||||
|
|
|
||||||
|
LL | #[rustc::unknown]
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
||||||
|
= help: add #![feature(rustc_attrs)] to the crate attributes to enable
|
||||||
|
|
||||||
|
error: macro `rustc::unknown` may not be used in attributes
|
||||||
|
--> $DIR/feature-gate-rustc-attrs.rs:8:1
|
||||||
|
|
|
||||||
|
LL | #[rustc::unknown]
|
||||||
|
| ^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||||
|
--> $DIR/feature-gate-rustc-attrs.rs:13:12
|
||||||
|
|
|
||||||
|
LL | #[unknown::rustc]
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
||||||
|
= help: add #![feature(rustc_attrs)] to the crate attributes to enable
|
||||||
|
|
||||||
|
error: macro `unknown::rustc` may not be used in attributes
|
||||||
|
--> $DIR/feature-gate-rustc-attrs.rs:13:1
|
||||||
|
|
|
||||||
|
LL | #[unknown::rustc]
|
||||||
|
| ^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||||
|
--> $DIR/feature-gate-rustc-attrs.rs:20:3
|
||||||
|
|
|
||||||
|
LL | #[rustc_unknown]
|
||||||
|
| ^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
||||||
|
= help: add #![feature(rustc_attrs)] to the crate attributes to enable
|
||||||
|
|
||||||
|
error[E0658]: The attribute `rustc_unknown` is currently unknown to the compiler and may have meaning added to it in the future
|
||||||
|
--> $DIR/feature-gate-rustc-attrs.rs:20:3
|
||||||
|
|
|
||||||
|
LL | #[rustc_unknown]
|
||||||
|
| ^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
||||||
|
= help: add #![feature(custom_attribute)] to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: used by the test suite
|
error[E0658]: used by the test suite
|
||||||
--> $DIR/feature-gate-rustc-attrs.rs:3:1
|
--> $DIR/feature-gate-rustc-attrs.rs:18:1
|
||||||
|
|
|
|
||||||
LL | #[rustc_dummy]
|
LL | #[rustc_dummy]
|
||||||
| ^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^
|
||||||
@ -7,6 +55,6 @@ LL | #[rustc_dummy]
|
|||||||
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
||||||
= help: add #![feature(rustc_attrs)] to the crate attributes to enable
|
= help: add #![feature(rustc_attrs)] to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
@ -4,7 +4,9 @@
|
|||||||
extern crate derive_unstable_2;
|
extern crate derive_unstable_2;
|
||||||
|
|
||||||
#[derive(Unstable)]
|
#[derive(Unstable)]
|
||||||
//~^ ERROR attribute `rustc_foo` is currently unknown
|
//~^ ERROR attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||||
|
//~| ERROR attribute `rustc_foo` is currently unknown to the compiler
|
||||||
|
|
||||||
struct A;
|
struct A;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||||
|
--> $DIR/expand-to-unstable-2.rs:6:10
|
||||||
|
|
|
||||||
|
LL | #[derive(Unstable)]
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
||||||
|
= help: add #![feature(rustc_attrs)] to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: The attribute `rustc_foo` is currently unknown to the compiler and may have meaning added to it in the future
|
error[E0658]: The attribute `rustc_foo` is currently unknown to the compiler and may have meaning added to it in the future
|
||||||
--> $DIR/expand-to-unstable-2.rs:6:10
|
--> $DIR/expand-to-unstable-2.rs:6:10
|
||||||
|
|
|
|
||||||
@ -7,6 +16,6 @@ LL | #[derive(Unstable)]
|
|||||||
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
||||||
= help: add #![feature(custom_attribute)] to the crate attributes to enable
|
= help: add #![feature(custom_attribute)] to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#[rustc_attribute_should_be_reserved]
|
#[rustc_attribute_should_be_reserved]
|
||||||
//~^ ERROR attribute `rustc_attribute_should_be_reserved` is currently unknown
|
//~^ ERROR attribute `rustc_attribute_should_be_reserved` is currently unknown
|
||||||
|
//~| ERROR attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||||
|
|
||||||
macro_rules! foo {
|
macro_rules! foo {
|
||||||
() => (());
|
() => (());
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
error[E0658]: 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]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
||||||
|
= help: add #![feature(rustc_attrs)] to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: The attribute `rustc_attribute_should_be_reserved` is currently unknown to the compiler and may have meaning added to it in the future
|
error[E0658]: The attribute `rustc_attribute_should_be_reserved` is currently unknown to the compiler and may have meaning added to it in the future
|
||||||
--> $DIR/reserved-attr-on-macro.rs:1:3
|
--> $DIR/reserved-attr-on-macro.rs:1:3
|
||||||
|
|
|
|
||||||
@ -8,13 +17,13 @@ LL | #[rustc_attribute_should_be_reserved]
|
|||||||
= help: add #![feature(custom_attribute)] to the crate attributes to enable
|
= help: add #![feature(custom_attribute)] 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:8:5
|
--> $DIR/reserved-attr-on-macro.rs:10:5
|
||||||
|
|
|
|
||||||
LL | foo!();
|
LL | foo!();
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
|
||||||
= note: import resolution is stuck, try simplifying macro imports
|
= note: import resolution is stuck, try simplifying macro imports
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
@ -4,5 +4,8 @@ fn foo() {}
|
|||||||
#[tests] //~ ERROR attribute `tests` is currently unknown to the compiler
|
#[tests] //~ ERROR attribute `tests` is currently unknown to the compiler
|
||||||
fn bar() {}
|
fn bar() {}
|
||||||
|
|
||||||
#[rustc_err] //~ ERROR attribute `rustc_err` is currently unknown
|
#[rustc_err]
|
||||||
|
//~^ ERROR attribute `rustc_err` is currently unknown
|
||||||
|
//~| ERROR attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||||
|
--> $DIR/attribute-typos.rs:7:3
|
||||||
|
|
|
||||||
|
LL | #[rustc_err]
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
||||||
|
= help: add #![feature(rustc_attrs)] to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: The attribute `rustc_err` is currently unknown to the compiler and may have meaning added to it in the future
|
error[E0658]: The attribute `rustc_err` is currently unknown to the compiler and may have meaning added to it in the future
|
||||||
--> $DIR/attribute-typos.rs:7:3
|
--> $DIR/attribute-typos.rs:7:3
|
||||||
|
|
|
|
||||||
@ -25,6 +34,6 @@ LL | #[deprcated]
|
|||||||
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
|
||||||
= help: add #![feature(custom_attribute)] to the crate attributes to enable
|
= help: add #![feature(custom_attribute)] to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
Loading…
Reference in New Issue
Block a user