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};
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",
+ );
}
}
#![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),*) => {
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]
+++ /dev/null
-// 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
-}
-// 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() {}
+++ /dev/null
-// 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)]
-struct MyStruct {
- number: i32
-}
-
-trait TestTrait {
- #[rustc_duplicate(TestType2)]
- type TestType;
-
- #[rustc_duplicate(required_fn2)]
- fn required_fn(&self);
-
- #[rustc_duplicate(provided_fn2)]
- fn provided_fn(&self) { }
-}
-
-impl TestTrait for MyStruct {
- #[rustc_duplicate(TestType2)]
- type TestType = f64;
-
- #[rustc_duplicate(required_fn2)]
- fn required_fn(&self) { }
-}
-
-fn main() {
- let s = MyStruct { number: 42 };
- s.required_fn();
- s.required_fn2();
- s.provided_fn();
- s.provided_fn2();
-
- let s = MyCopy { number: 42 };
-}
-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
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
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
--- /dev/null
+// 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
+}
-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`.
--- /dev/null
+// The duplicate macro will create a copy of the item with the given identifier.
+
+// check-pass
+// aux-build:duplicate.rs
+
+#[macro_use]
+extern crate duplicate;
+
+#[duplicate(MyCopy)]
+struct MyStruct {
+ number: i32,
+}
+
+trait TestTrait {
+ #[duplicate(TestType2)]
+ type TestType;
+
+ #[duplicate(required_fn2)]
+ fn required_fn(&self);
+
+ #[duplicate(provided_fn2)]
+ fn provided_fn(&self) {}
+}
+
+impl TestTrait for MyStruct {
+ #[duplicate(TestType2)]
+ type TestType = f64;
+
+ #[duplicate(required_fn2)]
+ fn required_fn(&self) {}
+}
+
+fn main() {
+ let s = MyStruct { number: 42 };
+ s.required_fn();
+ s.required_fn2();
+ s.provided_fn();
+ s.provided_fn2();
+
+ let s = MyCopy { number: 42 };
+}
-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
error: aborting due to 3 previous errors
-For more information about this error, try `rustc --explain E0658`.
-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
error: aborting due to 4 previous errors
-For more information about this error, try `rustc --explain E0658`.