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! {}
+}