From 1f8b15fba1f405b680825ce847cf983d0a4eb3b3 Mon Sep 17 00:00:00 2001 From: Joao Roberto Date: Sat, 25 Jul 2026 12:08:44 -0300 Subject: [PATCH] Fix cfg_attr inner attributes in file modules Return to pretty-printed token reconstruction when lexing source slices around an inner attribute produces unmatched delimiters. Cover cfg_attr-expanded proc-macro attributes in an out-of-line module, including sibling attributes on both sides. --- compiler/rustc_parse/src/lib.rs | 14 +++++++------- .../inner_attr_file_mod_cfg_attr_child.rs | 8 ++++++++ .../ui/proc-macro/inner-attr-file-mod-cfg-attr.rs | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 tests/ui/proc-macro/auxiliary/inner_attr_file_mod_cfg_attr_child.rs create mode 100644 tests/ui/proc-macro/inner-attr-file-mod-cfg-attr.rs diff --git a/compiler/rustc_parse/src/lib.rs b/compiler/rustc_parse/src/lib.rs index cd08fc3dc60a1..539c15f18a9a4 100644 --- a/compiler/rustc_parse/src/lib.rs +++ b/compiler/rustc_parse/src/lib.rs @@ -349,13 +349,13 @@ fn lex_token_trees_for_span( span: Span, ) -> Option> { let src = psess.source_map().span_to_snippet(span).ok()?; - let stream = unwrap_or_emit_fatal(lexer::lex_token_trees( - psess, - &src, - span.lo(), - None, - StripTokens::Nothing, - )); + let stream = match lexer::lex_token_trees(psess, &src, span.lo(), None, StripTokens::Nothing) { + Ok(stream) => stream, + Err(errs) => { + errs.into_iter().for_each(|err| err.cancel()); + return None; + } + }; Some((0..).map_while(move |index| stream.get(index).cloned())) } diff --git a/tests/ui/proc-macro/auxiliary/inner_attr_file_mod_cfg_attr_child.rs b/tests/ui/proc-macro/auxiliary/inner_attr_file_mod_cfg_attr_child.rs new file mode 100644 index 0000000000000..59114fb8e58af --- /dev/null +++ b/tests/ui/proc-macro/auxiliary/inner_attr_file_mod_cfg_attr_child.rs @@ -0,0 +1,8 @@ +#![cfg_attr(enabled, test_macros::identity_attr, allow(dead_code))] +#![cfg_attr(enabled, allow(unused_imports), test_macros::identity_attr)] +#![cfg_attr(enabled, test_macros::identity_attr)] +//! docs + +use std::fmt; + +fn unused() {} diff --git a/tests/ui/proc-macro/inner-attr-file-mod-cfg-attr.rs b/tests/ui/proc-macro/inner-attr-file-mod-cfg-attr.rs new file mode 100644 index 0000000000000..26b6a6f7041a0 --- /dev/null +++ b/tests/ui/proc-macro/inner-attr-file-mod-cfg-attr.rs @@ -0,0 +1,14 @@ +//@ check-pass +//@ proc-macro: test-macros.rs +//@ edition:2024 +//@ compile-flags: --cfg enabled --check-cfg=cfg(enabled) + +#![feature(custom_inner_attributes)] +#![deny(dead_code, unused_attributes, unused_imports)] + +extern crate test_macros; + +#[path = "auxiliary/inner_attr_file_mod_cfg_attr_child.rs"] +mod child; + +fn main() {}