Skip to content

Commit

Permalink
Address review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
petrochenkov committed Nov 9, 2019
1 parent 09fff50 commit 83f553c
Show file tree
Hide file tree
Showing 14 changed files with 140 additions and 10 deletions.
17 changes: 17 additions & 0 deletions src/librustc/hir/def.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Id> Res<Id> {
Expand Down Expand Up @@ -389,6 +405,7 @@ impl<Id> Res<Id> {
pub fn article(&self) -> &'static str {
match *self {
Res::Def(kind, _) => kind.article(),
Res::NonMacroAttr(kind) => kind.article(),
Res::Err => "an",
_ => "a",
}
Expand Down
3 changes: 1 addition & 2 deletions src/librustc_resolve/build_reduced_graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,7 @@ impl<'a> Resolver<'a> {
crate fn get_macro(&mut self, res: Res) -> Option<Lrc<SyntaxExtension>> {
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,
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_resolve/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
4 changes: 3 additions & 1 deletion src/librustc_resolve/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand Down Expand Up @@ -832,7 +833,8 @@ impl<'a> Resolver<'a> {
res: Option<Res>, 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()));
Expand Down
4 changes: 2 additions & 2 deletions src/libsyntax/feature_gate/active.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions src/libsyntax/feature_gate/builtin_attrs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
),

Expand Down
14 changes: 14 additions & 0 deletions src/test/ui/attributes/register-attr-tool-import.rs
Original file line number Diff line number Diff line change
@@ -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() {}
26 changes: 26 additions & 0 deletions src/test/ui/attributes/register-attr-tool-import.stderr
Original file line number Diff line number Diff line change
@@ -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

14 changes: 14 additions & 0 deletions src/test/ui/attributes/register-attr-tool-prelude.rs
Original file line number Diff line number Diff line change
@@ -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() {}
15 changes: 15 additions & 0 deletions src/test/ui/attributes/register-attr-tool-prelude.stderr
Original file line number Diff line number Diff line change
@@ -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`.
10 changes: 10 additions & 0 deletions src/test/ui/attributes/register-attr-tool-unused.rs
Original file line number Diff line number Diff line change
@@ -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() {}
33 changes: 33 additions & 0 deletions src/test/ui/attributes/register-attr-tool-unused.stderr
Original file line number Diff line number Diff line change
@@ -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

Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 83f553c

Please sign in to comment.