From 872a13faa58e663301bdb6c1a0518a79997164b9 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Fri, 29 May 2026 23:51:40 +0200 Subject: [PATCH] Fix foreign items in rustdoc macro expansion feature --- src/librustdoc/html/macro_expansion.rs | 12 +++++++++++- .../macro-expansion/c-var-args.rs | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 tests/rustdoc-html/macro-expansion/c-var-args.rs diff --git a/src/librustdoc/html/macro_expansion.rs b/src/librustdoc/html/macro_expansion.rs index ec8b65984852c..4c820415e273c 100644 --- a/src/librustdoc/html/macro_expansion.rs +++ b/src/librustdoc/html/macro_expansion.rs @@ -2,7 +2,7 @@ use rustc_ast::visit::{ AssocCtxt, Visitor, walk_assoc_item, walk_crate, walk_expr, walk_item, walk_pat, walk_stmt, walk_ty, }; -use rustc_ast::{AssocItem, Crate, Expr, Item, Pat, Stmt, Ty}; +use rustc_ast::{AssocItem, Crate, Expr, ForeignItem, Item, Pat, Stmt, Ty}; use rustc_data_structures::fx::FxHashMap; use rustc_span::source_map::SourceMap; use rustc_span::{BytePos, Span}; @@ -174,4 +174,14 @@ impl<'ast> Visitor<'ast> for ExpandedCodeVisitor<'ast> { walk_assoc_item(self, item, ctxt); } } + + fn visit_foreign_item(&mut self, item: &'ast ForeignItem) -> Self::Result { + if item.span.from_expansion() { + self.handle_new_span(item.span, || { + rustc_ast_pretty::pprust::foreign_item_to_string(item) + }); + } else { + walk_item(self, item); + } + } } diff --git a/tests/rustdoc-html/macro-expansion/c-var-args.rs b/tests/rustdoc-html/macro-expansion/c-var-args.rs new file mode 100644 index 0000000000000..1d42036cc7bf7 --- /dev/null +++ b/tests/rustdoc-html/macro-expansion/c-var-args.rs @@ -0,0 +1,19 @@ +// Ensure that C var args (`va_list`) work. +// Regression test for . + +//@ compile-flags: -Zunstable-options --generate-macro-expansion + +#![crate_name = "foo"] + +//@ has 'src/foo/c-var-args.rs.html' + +macro_rules! print { + () => { + fn printf(...); + }; +} + +//@ has - '//*[@class="expansion"]/*[@class="expanded"]' 'fn printf(...);' +extern "C" { + print! {} +}