@@ -19,7 +19,7 @@ use rustc_middle::ty::visit::TypeVisitableExt;
1919use rustc_middle::ty::{self, IsSuggestable, Ty, TyCtxt};
2020use rustc_middle::{bug, span_bug};
2121use rustc_session::Session;
22- use rustc_span::{DUMMY_SP, Ident, Span, Symbol, kw, sym};
22+ use rustc_span::{DUMMY_SP, Ident, Span, kw, sym};
2323use rustc_trait_selection::error_reporting::infer::{FailureCode, ObligationCauseExt};
2424use rustc_trait_selection::infer::InferCtxtExt;
2525use rustc_trait_selection::traits::{self, ObligationCauseCode, ObligationCtxt, SelectionContext};
@@ -2679,7 +2679,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
26792679 params.get(is_method as usize..params.len() - sig.decl.c_variadic as usize)?;
26802680 debug_assert_eq!(params.len(), fn_inputs.len());
26812681 Some((
2682- fn_inputs.zip(params.iter().map(|param| FnParam::Name(param))).collect(),
2682+ fn_inputs.zip(params.iter().map(|& param| FnParam::Name(param))).collect(),
26832683 generics,
26842684 ))
26852685 }
@@ -2710,32 +2710,38 @@ impl<'tcx> Visitor<'tcx> for FindClosureArg<'tcx> {
27102710#[derive(Clone, Copy)]
27112711enum FnParam<'hir> {
27122712 Param(&'hir hir::Param<'hir>),
2713- Name(&'hir Ident),
2713+ Name(Ident),
27142714}
2715+
27152716impl FnParam<'_> {
27162717 fn span(&self) -> Span {
27172718 match self {
2718- Self::Param(x) => x.span,
2719- Self::Name(x) => x.span,
2720- }
2721- }
2722-
2723- fn name(&self) -> Option<Symbol> {
2724- match self {
2725- Self::Param(x) if let hir::PatKind::Binding(_, _, ident, _) = x.pat.kind => {
2726- Some(ident.name)
2727- }
2728- Self::Name(x) if x.name != kw::Empty => Some(x.name),
2729- _ => None,
2719+ Self::Param(param) => param.span,
2720+ Self::Name(ident) => ident.span,
27302721 }
27312722 }
27322723
27332724 fn display(&self, idx: usize) -> impl '_ + fmt::Display {
27342725 struct D<'a>(FnParam<'a>, usize);
27352726 impl fmt::Display for D<'_> {
27362727 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2737- if let Some(name) = self.0.name() {
2738- write!(f, "`{name}`")
2728+ // A "unique" param name is one that (a) exists, and (b) is guaranteed to be unique
2729+ // among the parameters, i.e. `_` does not count.
2730+ let unique_name = match self.0 {
2731+ FnParam::Param(param)
2732+ if let hir::PatKind::Binding(_, _, ident, _) = param.pat.kind =>
2733+ {
2734+ Some(ident.name)
2735+ }
2736+ FnParam::Name(ident)
2737+ if ident.name != kw::Empty && ident.name != kw::Underscore =>
2738+ {
2739+ Some(ident.name)
2740+ }
2741+ _ => None,
2742+ };
2743+ if let Some(unique_name) = unique_name {
2744+ write!(f, "`{unique_name}`")
27392745 } else {
27402746 write!(f, "parameter #{}", self.1 + 1)
27412747 }
0 commit comments