From 83f553c95c4a7cfd44ec00ce056708a7022b7bf7 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Mon, 4 Nov 2019 16:47:03 +0300 Subject: [PATCH] Address review comments --- src/librustc/hir/def.rs | 17 ++++++++++ src/librustc_resolve/build_reduced_graph.rs | 3 +- src/librustc_resolve/lib.rs | 2 +- src/librustc_resolve/macros.rs | 4 ++- src/libsyntax/feature_gate/active.rs | 4 +-- src/libsyntax/feature_gate/builtin_attrs.rs | 4 +-- .../attributes/register-attr-tool-import.rs | 14 ++++++++ .../register-attr-tool-import.stderr | 26 +++++++++++++++ .../attributes/register-attr-tool-prelude.rs | 14 ++++++++ .../register-attr-tool-prelude.stderr | 15 +++++++++ .../attributes/register-attr-tool-unused.rs | 10 ++++++ .../register-attr-tool-unused.stderr | 33 +++++++++++++++++++ .../feature-gate-register_attr.stderr | 2 +- .../feature-gate-register_tool.stderr | 2 +- 14 files changed, 140 insertions(+), 10 deletions(-) create mode 100644 src/test/ui/attributes/register-attr-tool-import.rs create mode 100644 src/test/ui/attributes/register-attr-tool-import.stderr create mode 100644 src/test/ui/attributes/register-attr-tool-prelude.rs create mode 100644 src/test/ui/attributes/register-attr-tool-prelude.stderr create mode 100644 src/test/ui/attributes/register-attr-tool-unused.rs create mode 100644 src/test/ui/attributes/register-attr-tool-unused.stderr diff --git a/src/librustc/hir/def.rs b/src/librustc/hir/def.rs index 9eb6baeb4ba..025494e3fd7 100644 --- a/src/librustc/hir/def.rs +++ b/src/librustc/hir/def.rs @@ -333,6 +333,22 @@ impl NonMacroAttrKind { NonMacroAttrKind::LegacyPluginHelper => "legacy plugin helper attribute", } } + + pub fn article(self) -> &'static str { + match self { + NonMacroAttrKind::Registered => "an", + _ => "a", + } + } + + /// Users of some attributes cannot mark them as used, so they are considered always used. + pub fn is_used(self) -> bool { + match self { + NonMacroAttrKind::Tool | NonMacroAttrKind::DeriveHelper => true, + NonMacroAttrKind::Builtin | NonMacroAttrKind::Registered | + NonMacroAttrKind::LegacyPluginHelper => false, + } + } } impl Res { @@ -389,6 +405,7 @@ impl Res { pub fn article(&self) -> &'static str { match *self { Res::Def(kind, _) => kind.article(), + Res::NonMacroAttr(kind) => kind.article(), Res::Err => "an", _ => "a", } diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs index 4239518b879..32f1de4a830 100644 --- a/src/librustc_resolve/build_reduced_graph.rs +++ b/src/librustc_resolve/build_reduced_graph.rs @@ -141,8 +141,7 @@ impl<'a> Resolver<'a> { crate fn get_macro(&mut self, res: Res) -> Option> { match res { Res::Def(DefKind::Macro(..), def_id) => self.get_macro_by_def_id(def_id), - Res::NonMacroAttr(attr_kind) => - Some(self.non_macro_attr(attr_kind == NonMacroAttrKind::Tool)), + Res::NonMacroAttr(attr_kind) => Some(self.non_macro_attr(attr_kind.is_used())), _ => None, } } diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index a54d498272e..697e4925d72 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -1472,7 +1472,7 @@ impl<'a> Resolver<'a> { Scope::MacroRules(..) => true, Scope::CrateRoot => true, Scope::Module(..) => true, - Scope::RegisteredAttrs => true, + Scope::RegisteredAttrs => use_prelude, Scope::MacroUsePrelude => use_prelude || rust_2015, Scope::BuiltinAttrs => true, Scope::LegacyPluginHelpers => use_prelude || rust_2015, diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index 2d7048fe5c1..3087888a563 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -94,6 +94,7 @@ fn fast_print_path(path: &ast::Path) -> Symbol { } } +/// The code common between processing `#![register_tool]` and `#![register_attr]`. fn registered_idents( sess: &Session, attrs: &[ast::Attribute], @@ -832,7 +833,8 @@ impl<'a> Resolver<'a> { res: Option, span: Span) { if let Some(Res::NonMacroAttr(kind)) = res { if kind != NonMacroAttrKind::Tool && binding.map_or(true, |b| b.is_import()) { - let msg = format!("cannot use a {} through an import", kind.descr()); + let msg = + format!("cannot use {} {} through an import", kind.article(), kind.descr()); let mut err = self.session.struct_span_err(span, &msg); if let Some(binding) = binding { err.span_note(binding.span, &format!("the {} imported here", kind.descr())); diff --git a/src/libsyntax/feature_gate/active.rs b/src/libsyntax/feature_gate/active.rs index 319ca5fd3e2..d59d0f0e28e 100644 --- a/src/libsyntax/feature_gate/active.rs +++ b/src/libsyntax/feature_gate/active.rs @@ -524,10 +524,10 @@ declare_features! ( (active, abi_efiapi, "1.40.0", Some(65815), None), /// Allows using the `#[register_attr]` attribute. - (active, register_attr, "1.41.0", Some(29642), None), + (active, register_attr, "1.41.0", Some(66080), None), /// Allows using the `#[register_attr]` attribute. - (active, register_tool, "1.41.0", Some(44690), None), + (active, register_tool, "1.41.0", Some(66079), None), // ------------------------------------------------------------------------- // feature-group-end: actual feature gates diff --git a/src/libsyntax/feature_gate/builtin_attrs.rs b/src/libsyntax/feature_gate/builtin_attrs.rs index 3e77b4cf495..608cc2a09cb 100644 --- a/src/libsyntax/feature_gate/builtin_attrs.rs +++ b/src/libsyntax/feature_gate/builtin_attrs.rs @@ -330,11 +330,11 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ gated!(ffi_returns_twice, Whitelisted, template!(Word), experimental!(ffi_returns_twice)), gated!(track_caller, Whitelisted, template!(Word), experimental!(track_caller)), gated!( - register_attr, Whitelisted, template!(List: "attr1, attr2, ..."), + register_attr, CrateLevel, template!(List: "attr1, attr2, ..."), experimental!(register_attr), ), gated!( - register_tool, Whitelisted, template!(List: "tool1, tool2, ..."), + register_tool, CrateLevel, template!(List: "tool1, tool2, ..."), experimental!(register_tool), ), diff --git a/src/test/ui/attributes/register-attr-tool-import.rs b/src/test/ui/attributes/register-attr-tool-import.rs new file mode 100644 index 00000000000..3d0cf9154fb --- /dev/null +++ b/src/test/ui/attributes/register-attr-tool-import.rs @@ -0,0 +1,14 @@ +// edition:2018 + +#![feature(register_attr)] +#![feature(register_tool)] + +#![register_attr(attr)] +#![register_tool(tool)] + +use attr as renamed_attr; // OK +use tool as renamed_tool; // OK + +#[renamed_attr] //~ ERROR cannot use an explicitly registered attribute through an import +#[renamed_tool::attr] //~ ERROR cannot use a tool module through an import +fn main() {} diff --git a/src/test/ui/attributes/register-attr-tool-import.stderr b/src/test/ui/attributes/register-attr-tool-import.stderr new file mode 100644 index 00000000000..6f280c8e0d9 --- /dev/null +++ b/src/test/ui/attributes/register-attr-tool-import.stderr @@ -0,0 +1,26 @@ +error: cannot use an explicitly registered attribute through an import + --> $DIR/register-attr-tool-import.rs:12:3 + | +LL | #[renamed_attr] + | ^^^^^^^^^^^^ + | +note: the explicitly registered attribute imported here + --> $DIR/register-attr-tool-import.rs:9:5 + | +LL | use attr as renamed_attr; // OK + | ^^^^^^^^^^^^^^^^^^^^ + +error: cannot use a tool module through an import + --> $DIR/register-attr-tool-import.rs:13:3 + | +LL | #[renamed_tool::attr] + | ^^^^^^^^^^^^ + | +note: the tool module imported here + --> $DIR/register-attr-tool-import.rs:10:5 + | +LL | use tool as renamed_tool; // OK + | ^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/attributes/register-attr-tool-prelude.rs b/src/test/ui/attributes/register-attr-tool-prelude.rs new file mode 100644 index 00000000000..a491773f5eb --- /dev/null +++ b/src/test/ui/attributes/register-attr-tool-prelude.rs @@ -0,0 +1,14 @@ +#![feature(register_attr)] +#![feature(register_tool)] + +#![register_attr(attr)] +#![register_tool(tool)] + +#[no_implicit_prelude] +mod m { + #[attr] //~ ERROR cannot find attribute `attr` in this scope + #[tool::attr] //~ ERROR failed to resolve: use of undeclared type or module `tool` + fn check() {} +} + +fn main() {} diff --git a/src/test/ui/attributes/register-attr-tool-prelude.stderr b/src/test/ui/attributes/register-attr-tool-prelude.stderr new file mode 100644 index 00000000000..66a4eeb6aa4 --- /dev/null +++ b/src/test/ui/attributes/register-attr-tool-prelude.stderr @@ -0,0 +1,15 @@ +error[E0433]: failed to resolve: use of undeclared type or module `tool` + --> $DIR/register-attr-tool-prelude.rs:10:7 + | +LL | #[tool::attr] + | ^^^^ use of undeclared type or module `tool` + +error: cannot find attribute `attr` in this scope + --> $DIR/register-attr-tool-prelude.rs:9:7 + | +LL | #[attr] + | ^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0433`. diff --git a/src/test/ui/attributes/register-attr-tool-unused.rs b/src/test/ui/attributes/register-attr-tool-unused.rs new file mode 100644 index 00000000000..546e372f5e3 --- /dev/null +++ b/src/test/ui/attributes/register-attr-tool-unused.rs @@ -0,0 +1,10 @@ +#![deny(unused)] + +#![feature(register_attr)] +#![feature(register_tool)] + +#[register_attr(attr)] //~ ERROR crate-level attribute should be an inner attribute + //~| ERROR unused attribute +#[register_tool(tool)] //~ ERROR crate-level attribute should be an inner attribute + //~| ERROR unused attribute +fn main() {} diff --git a/src/test/ui/attributes/register-attr-tool-unused.stderr b/src/test/ui/attributes/register-attr-tool-unused.stderr new file mode 100644 index 00000000000..0756c572c35 --- /dev/null +++ b/src/test/ui/attributes/register-attr-tool-unused.stderr @@ -0,0 +1,33 @@ +error: unused attribute + --> $DIR/register-attr-tool-unused.rs:6:1 + | +LL | #[register_attr(attr)] + | ^^^^^^^^^^^^^^^^^^^^^^ + | +note: lint level defined here + --> $DIR/register-attr-tool-unused.rs:1:9 + | +LL | #![deny(unused)] + | ^^^^^^ + = note: `#[deny(unused_attributes)]` implied by `#[deny(unused)]` + +error: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]` + --> $DIR/register-attr-tool-unused.rs:6:1 + | +LL | #[register_attr(attr)] + | ^^^^^^^^^^^^^^^^^^^^^^ + +error: unused attribute + --> $DIR/register-attr-tool-unused.rs:8:1 + | +LL | #[register_tool(tool)] + | ^^^^^^^^^^^^^^^^^^^^^^ + +error: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]` + --> $DIR/register-attr-tool-unused.rs:8:1 + | +LL | #[register_tool(tool)] + | ^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 4 previous errors + diff --git a/src/test/ui/feature-gates/feature-gate-register_attr.stderr b/src/test/ui/feature-gates/feature-gate-register_attr.stderr index b097f578bf2..3965d481d9b 100644 --- a/src/test/ui/feature-gates/feature-gate-register_attr.stderr +++ b/src/test/ui/feature-gates/feature-gate-register_attr.stderr @@ -4,7 +4,7 @@ error[E0658]: the `#[register_attr]` attribute is an experimental feature LL | #![register_attr(attr)] | ^^^^^^^^^^^^^^^^^^^^^^^ | - = 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/66080 = help: add `#![feature(register_attr)]` to the crate attributes to enable error: aborting due to previous error diff --git a/src/test/ui/feature-gates/feature-gate-register_tool.stderr b/src/test/ui/feature-gates/feature-gate-register_tool.stderr index 85a86d2daf8..177342aed90 100644 --- a/src/test/ui/feature-gates/feature-gate-register_tool.stderr +++ b/src/test/ui/feature-gates/feature-gate-register_tool.stderr @@ -4,7 +4,7 @@ error[E0658]: the `#[register_tool]` attribute is an experimental feature LL | #![register_tool(tool)] | ^^^^^^^^^^^^^^^^^^^^^^^ | - = note: for more information, see https://github.com/rust-lang/rust/issues/44690 + = note: for more information, see https://github.com/rust-lang/rust/issues/66079 = help: add `#![feature(register_tool)]` to the crate attributes to enable error: aborting due to previous error