Skip to content

Commit

Permalink
Rollup merge of rust-lang#80031 - petrochenkov:builtina, r=estebank
Browse files Browse the repository at this point in the history
resolve: Reject ambiguity built-in attr vs different built-in attr

Fixes rust-lang#79798.

Resolution ensures that inert attributes cannot be used through imports like this, but built-in attributes don't go through initial resolution (only through resolution validation), so we have to keep some extra data (the built-in attribute name) to prevent it from happening.
  • Loading branch information
m-ou-se authored Jan 16, 2021
2 parents f6f754a + 7f9a2cf commit c06ff92
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 9 deletions.
7 changes: 4 additions & 3 deletions compiler/rustc_hir/src/def.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use rustc_ast as ast;
use rustc_ast::NodeId;
use rustc_macros::HashStable_Generic;
use rustc_span::hygiene::MacroKind;
use rustc_span::Symbol;

use std::array::IntoIter;
use std::fmt::Debug;
Expand Down Expand Up @@ -34,7 +35,7 @@ pub enum CtorKind {
#[derive(HashStable_Generic)]
pub enum NonMacroAttrKind {
/// Single-segment attribute defined by the language (`#[inline]`)
Builtin,
Builtin(Symbol),
/// Multi-segment custom attribute living in a "tool module" (`#[rustfmt::skip]`).
Tool,
/// Single-segment custom attribute registered by a derive macro (`#[serde(default)]`).
Expand Down Expand Up @@ -371,7 +372,7 @@ impl CtorKind {
impl NonMacroAttrKind {
pub fn descr(self) -> &'static str {
match self {
NonMacroAttrKind::Builtin => "built-in attribute",
NonMacroAttrKind::Builtin(..) => "built-in attribute",
NonMacroAttrKind::Tool => "tool attribute",
NonMacroAttrKind::DeriveHelper | NonMacroAttrKind::DeriveHelperCompat => {
"derive helper attribute"
Expand All @@ -393,7 +394,7 @@ impl NonMacroAttrKind {
NonMacroAttrKind::Tool
| NonMacroAttrKind::DeriveHelper
| NonMacroAttrKind::DeriveHelperCompat => true,
NonMacroAttrKind::Builtin | NonMacroAttrKind::Registered => false,
NonMacroAttrKind::Builtin(..) | NonMacroAttrKind::Registered => false,
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_resolve/src/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -683,7 +683,7 @@ impl<'a> Resolver<'a> {
));
}
Scope::BuiltinAttrs => {
let res = Res::NonMacroAttr(NonMacroAttrKind::Builtin);
let res = Res::NonMacroAttr(NonMacroAttrKind::Builtin(kw::Empty));
if filter_fn(res) {
suggestions.extend(
BUILTIN_ATTRIBUTES
Expand Down
12 changes: 9 additions & 3 deletions compiler/rustc_resolve/src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -757,7 +757,11 @@ impl<'a> Resolver<'a> {
}
Scope::BuiltinAttrs => {
if is_builtin_attr_name(ident.name) {
ok(Res::NonMacroAttr(NonMacroAttrKind::Builtin), DUMMY_SP, this.arenas)
ok(
Res::NonMacroAttr(NonMacroAttrKind::Builtin(ident.name)),
DUMMY_SP,
this.arenas,
)
} else {
Err(Determinacy::Determined)
}
Expand Down Expand Up @@ -810,13 +814,15 @@ impl<'a> Resolver<'a> {
// Found another solution, if the first one was "weak", report an error.
let (res, innermost_res) = (binding.res(), innermost_binding.res());
if res != innermost_res {
let builtin = Res::NonMacroAttr(NonMacroAttrKind::Builtin);
let is_builtin = |res| {
matches!(res, Res::NonMacroAttr(NonMacroAttrKind::Builtin(..)))
};
let derive_helper_compat =
Res::NonMacroAttr(NonMacroAttrKind::DeriveHelperCompat);

let ambiguity_error_kind = if is_import {
Some(AmbiguityKind::Import)
} else if innermost_res == builtin || res == builtin {
} else if is_builtin(innermost_res) || is_builtin(res) {
Some(AmbiguityKind::BuiltinAttr)
} else if innermost_res == derive_helper_compat
|| res == derive_helper_compat
Expand Down
6 changes: 5 additions & 1 deletion src/test/ui/proc-macro/ambiguous-builtin-attrs.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// edition:2018
// aux-build:builtin-attrs.rs

#![feature(decl_macro)] //~ ERROR `feature` is ambiguous

extern crate builtin_attrs;
Expand Down Expand Up @@ -31,3 +31,7 @@ fn main() {
Bench;
NonExistent; //~ ERROR cannot find value `NonExistent` in this scope
}

use deny as allow;
#[allow(unused)] //~ ERROR `allow` is ambiguous (built-in attribute vs any other name)
fn builtin_renamed() {}
16 changes: 15 additions & 1 deletion src/test/ui/proc-macro/ambiguous-builtin-attrs.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,20 @@ LL | use builtin_attrs::*;
| ^^^^^^^^^^^^^^^^
= help: use `crate::repr` to refer to this attribute macro unambiguously

error[E0659]: `allow` is ambiguous (built-in attribute vs any other name)
--> $DIR/ambiguous-builtin-attrs.rs:36:3
|
LL | #[allow(unused)]
| ^^^^^ ambiguous name
|
= note: `allow` could refer to a built-in attribute
note: `allow` could also refer to the built-in attribute imported here
--> $DIR/ambiguous-builtin-attrs.rs:35:5
|
LL | use deny as allow;
| ^^^^^^^^^^^^^
= help: use `crate::allow` to refer to this built-in attribute unambiguously

error[E0659]: `feature` is ambiguous (built-in attribute vs any other name)
--> $DIR/ambiguous-builtin-attrs.rs:3:4
|
Expand All @@ -80,7 +94,7 @@ error[E0517]: attribute should be applied to a struct, enum, or union
LL | fn non_macro_expanded_location<#[repr(C)] T>() {
| ^ - not a struct, enum, or union

error: aborting due to 7 previous errors
error: aborting due to 8 previous errors

Some errors have detailed explanations: E0425, E0517, E0659.
For more information about an error, try `rustc --explain E0425`.

0 comments on commit c06ff92

Please sign in to comment.