Fix ICE for parsed attributes with longer path not handled by CheckAttrVisitor
Signed-off-by: Jonathan Brouwer <jonathantbrouwer@gmail.com>
This commit is contained in:
parent
855e0fe46e
commit
2f05fa6fff
6 changed files with 40 additions and 1 deletions
|
|
@ -4349,6 +4349,7 @@ dependencies = [
|
|||
"rustc_ast_lowering",
|
||||
"rustc_ast_pretty",
|
||||
"rustc_attr_data_structures",
|
||||
"rustc_attr_parsing",
|
||||
"rustc_data_structures",
|
||||
"rustc_errors",
|
||||
"rustc_expand",
|
||||
|
|
|
|||
|
|
@ -718,6 +718,11 @@ impl<'sess, S: Stage> AttributeParser<'sess, S> {
|
|||
attributes
|
||||
}
|
||||
|
||||
/// Returns whether there is a parser for an attribute with this name
|
||||
pub fn is_parsed_attribute(path: &[Symbol]) -> bool {
|
||||
Late::parsers().0.contains_key(path)
|
||||
}
|
||||
|
||||
fn lower_attr_args(&self, args: &ast::AttrArgs, lower_span: impl Fn(Span) -> Span) -> AttrArgs {
|
||||
match args {
|
||||
ast::AttrArgs::Empty => AttrArgs::Empty,
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ rustc_ast = { path = "../rustc_ast" }
|
|||
rustc_ast_lowering = { path = "../rustc_ast_lowering" }
|
||||
rustc_ast_pretty = { path = "../rustc_ast_pretty" }
|
||||
rustc_attr_data_structures = { path = "../rustc_attr_data_structures" }
|
||||
rustc_attr_parsing = { path = "../rustc_attr_parsing" }
|
||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||
rustc_errors = { path = "../rustc_errors" }
|
||||
rustc_expand = { path = "../rustc_expand" }
|
||||
|
|
|
|||
|
|
@ -7,10 +7,12 @@
|
|||
|
||||
use std::cell::Cell;
|
||||
use std::collections::hash_map::Entry;
|
||||
use std::slice;
|
||||
|
||||
use rustc_abi::{Align, ExternAbi, Size};
|
||||
use rustc_ast::{AttrStyle, LitKind, MetaItemInner, MetaItemKind, ast};
|
||||
use rustc_attr_data_structures::{AttributeKind, InlineAttr, ReprAttr, find_attr};
|
||||
use rustc_attr_parsing::{AttributeParser, Late};
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_errors::{Applicability, DiagCtxtHandle, IntoDiagArg, MultiSpan, StashKey};
|
||||
use rustc_feature::{AttributeDuplicates, AttributeType, BUILTIN_ATTRIBUTE_MAP, BuiltinAttribute};
|
||||
|
|
@ -373,11 +375,18 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
| sym::custom_mir,
|
||||
..
|
||||
] => {}
|
||||
[name, ..] => {
|
||||
[name, rest@..] => {
|
||||
match BUILTIN_ATTRIBUTE_MAP.get(name) {
|
||||
// checked below
|
||||
Some(BuiltinAttribute { type_: AttributeType::CrateLevel, .. }) => {}
|
||||
Some(_) => {
|
||||
if rest.len() > 0 && AttributeParser::<Late>::is_parsed_attribute(slice::from_ref(name)) {
|
||||
// Check if we tried to use a builtin attribute as an attribute namespace, like `#[must_use::skip]`.
|
||||
// This check is here to solve https://github.com/rust-lang/rust/issues/137590
|
||||
// An error is already produced for this case elsewhere
|
||||
continue
|
||||
}
|
||||
|
||||
// FIXME: differentiate between unstable and internal attributes just
|
||||
// like we do with features instead of just accepting `rustc_`
|
||||
// attributes by name. That should allow trimming the above list, too.
|
||||
|
|
|
|||
8
tests/ui/attributes/builtin-attribute-prefix.rs
Normal file
8
tests/ui/attributes/builtin-attribute-prefix.rs
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
// Regression test for https://github.com/rust-lang/rust/issues/143789
|
||||
#[must_use::skip]
|
||||
//~^ ERROR failed to resolve: use of unresolved module or unlinked crate `must_use`
|
||||
fn main() { }
|
||||
|
||||
// Regression test for https://github.com/rust-lang/rust/issues/137590
|
||||
struct S(#[stable::skip] u8, u16, u32);
|
||||
//~^ ERROR failed to resolve: use of unresolved module or unlinked crate `stable`
|
||||
15
tests/ui/attributes/builtin-attribute-prefix.stderr
Normal file
15
tests/ui/attributes/builtin-attribute-prefix.stderr
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `stable`
|
||||
--> $DIR/builtin-attribute-prefix.rs:7:12
|
||||
|
|
||||
LL | struct S(#[stable::skip] u8, u16, u32);
|
||||
| ^^^^^^ use of unresolved module or unlinked crate `stable`
|
||||
|
||||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `must_use`
|
||||
--> $DIR/builtin-attribute-prefix.rs:2:3
|
||||
|
|
||||
LL | #[must_use::skip]
|
||||
| ^^^^^^^^ use of unresolved module or unlinked crate `must_use`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0433`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue