tests: add regression test for incorrect "builtin attribute is checked" assertion ICE
See <https://github.com/rust-lang/rust/issues/128622>.
This commit is contained in:
parent
64ebd39da5
commit
9e5c9c14c7
58
tests/ui/attributes/check-builtin-attr-ice.rs
Normal file
58
tests/ui/attributes/check-builtin-attr-ice.rs
Normal file
@ -0,0 +1,58 @@
|
||||
//! Regression test for #128622.
|
||||
//!
|
||||
//! PR #128581 introduced an assertion that all builtin attributes are actually checked via
|
||||
//! `CheckAttrVisitor` and aren't accidentally usable on completely unrelated HIR nodes.
|
||||
//! Unfortunately, the check had correctness problems.
|
||||
//!
|
||||
//! The match on attribute path segments looked like
|
||||
//!
|
||||
//! ```rs,ignore
|
||||
//! [sym::should_panic] => /* check is implemented */
|
||||
//! match BUILTIN_ATTRIBUTE_MAP.get(name) {
|
||||
//! // checked below
|
||||
//! Some(BuiltinAttribute { type_: AttributeType::CrateLevel, .. }) => {}
|
||||
//! Some(_) => {
|
||||
//! if !name.as_str().starts_with("rustc_") {
|
||||
//! span_bug!(
|
||||
//! attr.span,
|
||||
//! "builtin attribute {name:?} not handled by `CheckAttrVisitor`"
|
||||
//! )
|
||||
//! }
|
||||
//! }
|
||||
//! None => (),
|
||||
//! }
|
||||
//! ```
|
||||
//!
|
||||
//! However, it failed to account for edge cases such as an attribute whose:
|
||||
//!
|
||||
//! 1. path segments *starts* with a builtin attribute such as `should_panic`
|
||||
//! 2. which does not start with `rustc_`, and
|
||||
//! 3. is also an `AttributeType::Normal` attribute upon registration with the builtin attribute map
|
||||
//!
|
||||
//! These conditions when all satisfied cause the span bug to be issued for e.g.
|
||||
//! `#[should_panic::skip]` because the `[sym::should_panic]` arm is not matched (since it's
|
||||
//! `[sym::should_panic, sym::skip]`).
|
||||
//!
|
||||
//! This test checks that the span bug is not fired for such cases.
|
||||
//!
|
||||
//! issue: rust-lang/rust#128622
|
||||
|
||||
// Notably, `should_panic` is a `AttributeType::Normal` attribute that is checked separately.
|
||||
|
||||
struct Foo {
|
||||
#[should_panic::skip]
|
||||
//~^ ERROR failed to resolve
|
||||
pub field: u8,
|
||||
|
||||
#[should_panic::a::b::c]
|
||||
//~^ ERROR failed to resolve
|
||||
pub field2: u8,
|
||||
}
|
||||
|
||||
fn foo() {}
|
||||
|
||||
fn main() {
|
||||
#[deny::skip]
|
||||
//~^ ERROR failed to resolve
|
||||
foo();
|
||||
}
|
21
tests/ui/attributes/check-builtin-attr-ice.stderr
Normal file
21
tests/ui/attributes/check-builtin-attr-ice.stderr
Normal file
@ -0,0 +1,21 @@
|
||||
error[E0433]: failed to resolve: use of undeclared crate or module `should_panic`
|
||||
--> $DIR/check-builtin-attr-ice.rs:43:7
|
||||
|
|
||||
LL | #[should_panic::skip]
|
||||
| ^^^^^^^^^^^^ use of undeclared crate or module `should_panic`
|
||||
|
||||
error[E0433]: failed to resolve: use of undeclared crate or module `should_panic`
|
||||
--> $DIR/check-builtin-attr-ice.rs:47:7
|
||||
|
|
||||
LL | #[should_panic::a::b::c]
|
||||
| ^^^^^^^^^^^^ use of undeclared crate or module `should_panic`
|
||||
|
||||
error[E0433]: failed to resolve: use of undeclared crate or module `deny`
|
||||
--> $DIR/check-builtin-attr-ice.rs:55:7
|
||||
|
|
||||
LL | #[deny::skip]
|
||||
| ^^^^ use of undeclared crate or module `deny`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0433`.
|
Loading…
Reference in New Issue
Block a user