@@ -166,6 +166,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<'_
166166 def_id,
167167 ct_arg. hir_id ( ) ,
168168 ty. span ,
169+ ct_arg. span ( tcx) ,
169170 item. ident ,
170171 "associated constant" ,
171172 )
@@ -190,6 +191,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<'_
190191 def_id,
191192 ct_arg. hir_id ( ) ,
192193 ty. span ,
194+ ct_arg. span ( tcx) ,
193195 item. ident ,
194196 "associated constant" ,
195197 )
@@ -214,6 +216,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<'_
214216 def_id,
215217 body_id. hir_id ,
216218 ty. span ,
219+ tcx. hir_body ( body_id) . value . span ,
217220 ident,
218221 "static variable" ,
219222 )
@@ -236,6 +239,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<'_
236239 def_id,
237240 body. hir_id ( ) ,
238241 ty. span ,
242+ body. span ( tcx) ,
239243 ident,
240244 "constant" ,
241245 )
@@ -426,7 +430,8 @@ fn infer_placeholder_type<'tcx>(
426430 cx : & dyn HirTyLowerer < ' tcx > ,
427431 def_id : LocalDefId ,
428432 hir_id : HirId ,
429- span : Span ,
433+ ty_span : Span ,
434+ body_span : Span ,
430435 item_ident : Ident ,
431436 kind : & ' static str ,
432437) -> Ty < ' tcx > {
@@ -439,10 +444,10 @@ fn infer_placeholder_type<'tcx>(
439444 // us to improve in typeck so we do that now.
440445 let guar = cx
441446 . dcx ( )
442- . try_steal_modify_and_emit_err ( span , StashKey :: ItemNoType , |err| {
447+ . try_steal_modify_and_emit_err ( ty_span , StashKey :: ItemNoType , |err| {
443448 if !ty. references_error ( ) {
444449 // Only suggest adding `:` if it was missing (and suggested by parsing diagnostic).
445- let colon = if span == item_ident. span . shrink_to_hi ( ) { ":" } else { "" } ;
450+ let colon = if ty_span == item_ident. span . shrink_to_hi ( ) { ":" } else { "" } ;
446451
447452 // The parser provided a sub-optimal `HasPlaceholders` suggestion for the type.
448453 // We are typeck and have the real type, so remove that and suggest the actual type.
@@ -452,14 +457,14 @@ fn infer_placeholder_type<'tcx>(
452457
453458 if let Some ( ty) = ty. make_suggestable ( tcx, false , None ) {
454459 err. span_suggestion (
455- span ,
460+ ty_span ,
456461 format ! ( "provide a type for the {kind}" ) ,
457462 format ! ( "{colon} {ty}" ) ,
458463 Applicability :: MachineApplicable ,
459464 ) ;
460465 } else {
461466 with_forced_trimmed_paths ! ( err. span_note(
462- tcx . hir_span ( hir_id ) ,
467+ body_span ,
463468 format!( "however, the inferred type `{ty}` cannot be named" ) ,
464469 ) ) ;
465470 }
@@ -473,7 +478,7 @@ fn infer_placeholder_type<'tcx>(
473478 }
474479 // If we didn't find any infer tys, then just fallback to `span`.
475480 if visitor. spans . is_empty ( ) {
476- visitor. spans . push ( span ) ;
481+ visitor. spans . push ( ty_span ) ;
477482 }
478483 let mut diag = bad_placeholder ( cx, visitor. spans , kind) ;
479484
@@ -482,20 +487,20 @@ fn infer_placeholder_type<'tcx>(
482487 // same span. If this happens, we will fall through to this arm, so
483488 // we need to suppress the suggestion since it's invalid. Ideally we
484489 // would suppress the duplicated error too, but that's really hard.
485- if span . is_empty ( ) && span . from_expansion ( ) {
490+ if ty_span . is_empty ( ) && ty_span . from_expansion ( ) {
486491 // An approximately better primary message + no suggestion...
487492 diag. primary_message ( "missing type for item" ) ;
488493 } else if !ty. references_error ( ) {
489494 if let Some ( ty) = ty. make_suggestable ( tcx, false , None ) {
490495 diag. span_suggestion_verbose (
491- span ,
496+ ty_span ,
492497 "replace this with a fully-specified type" ,
493498 ty,
494499 Applicability :: MachineApplicable ,
495500 ) ;
496501 } else {
497502 with_forced_trimmed_paths ! ( diag. span_note(
498- tcx . hir_span ( hir_id ) ,
503+ body_span ,
499504 format!( "however, the inferred type `{ty}` cannot be named" ) ,
500505 ) ) ;
501506 }
0 commit comments