From 854d2abd782e901d597c2db5b972d61b90e45680 Mon Sep 17 00:00:00 2001 From: cijiugechu Date: Tue, 7 Apr 2026 22:26:21 +0800 Subject: [PATCH] fix pattern types rendering in rustdoc --- src/librustdoc/clean/mod.rs | 10 +++++++++- tests/rustdoc-html/pattern-types-implementors.rs | 12 ++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 tests/rustdoc-html/pattern-types-implementors.rs diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index d6dae29c932e..5934e0db7042 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -1808,7 +1808,15 @@ pub(crate) fn clean_ty<'tcx>(ty: &hir::Ty<'tcx>, cx: &mut DocContext<'tcx>) -> T BorrowedRef { lifetime, mutability: m.mutbl, type_: Box::new(clean_ty(m.ty, cx)) } } TyKind::Slice(ty) => Slice(Box::new(clean_ty(ty, cx))), - TyKind::Pat(ty, pat) => Type::Pat(Box::new(clean_ty(ty, cx)), format!("{pat:?}").into()), + TyKind::Pat(inner_ty, pat) => { + // Local HIR pattern types should print the same way as cross-crate inlined ones, + // so lower to the canonical `rustc_middle::ty::Pattern` representation first. + let pat = match lower_ty(cx.tcx, ty).kind() { + ty::Pat(_, pat) => format!("{pat:?}").into_boxed_str(), + _ => format!("{pat:?}").into(), + }; + Type::Pat(Box::new(clean_ty(inner_ty, cx)), pat) + } TyKind::FieldOf(ty, hir::TyFieldPath { variant, field }) => { let field_str = if let Some(variant) = variant { format!("{variant}.{field}") diff --git a/tests/rustdoc-html/pattern-types-implementors.rs b/tests/rustdoc-html/pattern-types-implementors.rs new file mode 100644 index 000000000000..2f49837b27e7 --- /dev/null +++ b/tests/rustdoc-html/pattern-types-implementors.rs @@ -0,0 +1,12 @@ +#![feature(pattern_types, pattern_type_macro)] +#![crate_name = "pattern_types_implementors"] + +use std::pat::pattern_type; + +pub trait MyTrait {} + +impl MyTrait for pattern_type!(*const u8 is !null) {} + +//@ has pattern_types_implementors/trait.MyTrait.html +//@ has - '//*[@id="implementors-list"]/*[@class="impl"]' 'impl MyTrait for *const u8 is !null' +//@ !has - '//*[@id="implementors-list"]/*[@class="impl"]' 'TyPat {'