diff options
| author | León Orell Valerian Liehr <me@fmease.dev> | 2025-05-02 23:03:30 +0200 |
|---|---|---|
| committer | Pietro Albini <pietro@pietroalbini.org> | 2025-05-09 17:58:54 +0200 |
| commit | fd5b1583fe3c7e2a866b18a42e9dcde0c647802d (patch) | |
| tree | 262619940b18f942d03c2621290be448b35a3ec6 | |
| parent | 287610b489e6e9139d14f86309919c89d15c181b (diff) | |
| download | rust-fd5b1583fe3c7e2a866b18a42e9dcde0c647802d.tar.gz rust-fd5b1583fe3c7e2a866b18a42e9dcde0c647802d.zip | |
Don't delay a bug on malformed meta items involving interpolated tokens
Co-authored-by: Jana Dönszelmann <jana@donsz.nl>
| -rw-r--r-- | compiler/rustc_attr_parsing/src/parser.rs | 15 | ||||
| -rw-r--r-- | tests/ui/attributes/auxiliary/derive_macro_with_helper.rs | 8 | ||||
| -rw-r--r-- | tests/ui/attributes/proc_macro_in_macro.rs | 16 |
3 files changed, 30 insertions, 9 deletions
diff --git a/compiler/rustc_attr_parsing/src/parser.rs b/compiler/rustc_attr_parsing/src/parser.rs index a8a1460591c..e84bac945dc 100644 --- a/compiler/rustc_attr_parsing/src/parser.rs +++ b/compiler/rustc_attr_parsing/src/parser.rs @@ -13,7 +13,7 @@ use rustc_ast_pretty::pprust; use rustc_errors::DiagCtxtHandle; use rustc_hir::{self as hir, AttrPath}; use rustc_span::symbol::{Ident, kw, sym}; -use rustc_span::{ErrorGuaranteed, Span, Symbol}; +use rustc_span::{Span, Symbol}; pub struct SegmentIterator<'a> { offset: usize, @@ -176,7 +176,7 @@ impl<'a> ArgParser<'a> { pub enum MetaItemOrLitParser<'a> { MetaItemParser(MetaItemParser<'a>), Lit(MetaItemLit), - Err(Span, ErrorGuaranteed), + Err(Span), } impl<'a> MetaItemOrLitParser<'a> { @@ -186,7 +186,7 @@ impl<'a> MetaItemOrLitParser<'a> { generic_meta_item_parser.span() } MetaItemOrLitParser::Lit(meta_item_lit) => meta_item_lit.span, - MetaItemOrLitParser::Err(span, _) => *span, + MetaItemOrLitParser::Err(span) => *span, } } @@ -495,12 +495,9 @@ impl<'a> MetaItemListParserContext<'a> { // where the macro didn't expand to a literal. An error is already given // for this at this point, and then we do continue. This makes this path // reachable... - let e = self.dcx.span_delayed_bug( - *span, - "expr in place where literal is expected (builtin attr parsing)", - ); - - return Some(MetaItemOrLitParser::Err(*span, e)); + // NOTE: For backward compatibility we can't emit any error / delayed bug here (yet). + // See <https://github.com/rust-lang/rust/issues/140612> + return Some(MetaItemOrLitParser::Err(*span)); } else { self.next_path()? }; diff --git a/tests/ui/attributes/auxiliary/derive_macro_with_helper.rs b/tests/ui/attributes/auxiliary/derive_macro_with_helper.rs new file mode 100644 index 00000000000..128af50ce36 --- /dev/null +++ b/tests/ui/attributes/auxiliary/derive_macro_with_helper.rs @@ -0,0 +1,8 @@ +extern crate proc_macro; + +use proc_macro::TokenStream; + +#[proc_macro_derive(Derive, attributes(arg))] +pub fn derive(_: TokenStream) -> TokenStream { + TokenStream::new() +} diff --git a/tests/ui/attributes/proc_macro_in_macro.rs b/tests/ui/attributes/proc_macro_in_macro.rs new file mode 100644 index 00000000000..ebe67d2a321 --- /dev/null +++ b/tests/ui/attributes/proc_macro_in_macro.rs @@ -0,0 +1,16 @@ +// Regression test for <https://github.com/rust-lang/rust/issues/137687#issuecomment-2816312274>. +//@ proc-macro: derive_macro_with_helper.rs +//@ edition: 2018 +//@ check-pass + +macro_rules! call_macro { + ($text:expr) => { + #[derive(derive_macro_with_helper::Derive)] + #[arg($text)] + pub struct Foo; + }; +} + +call_macro!(1 + 1); + +fn main() {} |
