use syntax::ext::expand::{AstFragment, Invocation, InvocationKind};
use syntax::ext::hygiene::Mark;
use syntax::ext::tt::macro_rules;
-use syntax::feature_gate::{
- feature_err, is_builtin_attr_name, AttributeGate, GateIssue, Stability, BUILTIN_ATTRIBUTES,
-};
+use syntax::feature_gate::{feature_err, emit_feature_err, is_builtin_attr_name};
+use syntax::feature_gate::{AttributeGate, GateIssue, Stability, BUILTIN_ATTRIBUTES};
use syntax::symbol::{Symbol, kw, sym};
use syntax::visit::Visitor;
use syntax::util::lev_distance::find_best_match_for_name;
let res = self.resolve_macro_to_res_inner(path, kind, parent_scope, trace, force);
// Report errors and enforce feature gates for the resolved macro.
+ let features = self.session.features_untracked();
if res != Err(Determinacy::Undetermined) {
// Do not report duplicated errors on every undetermined resolution.
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";
+ emit_feature_err(
+ &self.session.parse_sess,
+ sym::rustc_attrs,
+ segment.ident.span,
+ GateIssue::Language,
+ msg,
+ );
+ }
}
}
}
Res::NonMacroAttr(attr_kind) => {
if kind == MacroKind::Attr {
- let features = self.session.features_untracked();
if attr_kind == NonMacroAttrKind::Custom {
assert!(path.segments.len() == 1);
if !features.custom_attribute {
}
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 {
// ignore-stage1
// 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)]
#![rustc_crate_okay]
// 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]
//~^ 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() {}
+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
- --> $DIR/feature-gate-rustc-attrs.rs:3:1
+ --> $DIR/feature-gate-rustc-attrs.rs:18:1
|
LL | #[rustc_dummy]
| ^^^^^^^^^^^^^^
= 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: aborting due to previous error
+error: aborting due to 7 previous errors
For more information about this error, try `rustc --explain E0658`.
extern crate derive_unstable_2;
#[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;
fn main() {
+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
--> $DIR/expand-to-unstable-2.rs:6:10
|
= 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: aborting due to previous error
+error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0658`.
#[rustc_attribute_should_be_reserved]
//~^ 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 {
() => (());
}
+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
--> $DIR/reserved-attr-on-macro.rs:1:3
|
= help: add #![feature(custom_attribute)] to the crate attributes to enable
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!();
| ^^^
|
= 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`.
#[tests] //~ ERROR attribute `tests` is currently unknown to the compiler
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() {}
+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
--> $DIR/attribute-typos.rs:7:3
|
= 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: aborting due to 3 previous errors
+error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0658`.