@@ -79,6 +79,7 @@ use std::ops;
7979use std:: rc:: Rc ;
8080use std:: vec:: IntoIter ;
8181use collections:: enum_set:: { self , EnumSet , CLike } ;
82+ use collections:: slice:: SliceConcatExt ;
8283use std:: collections:: { HashMap , HashSet } ;
8384use syntax:: abi;
8485use syntax:: ast:: { CrateNum , DefId , ItemImpl , ItemTrait , LOCAL_CRATE } ;
@@ -5448,17 +5449,47 @@ impl<'tcx> ctxt<'tcx> {
54485449 let expected = values. expected ;
54495450 let found = values. found ;
54505451 self . sess . span_note ( sp,
5451- & format ! ( "conflicting type parameter defaults {} and {}" ,
5452- expected. ty,
5453- found. ty) ) ;
5454- self . sess . span_note ( expected. definition_span ,
5455- & format ! ( "a default was defined here..." ) ) ;
5452+ & format ! ( "conflicting type parameter defaults `{}` and `{}`" ,
5453+ expected. ty,
5454+ found. ty) ) ;
5455+
5456+ match ( expected. def_id . krate == ast:: LOCAL_CRATE , self . map . opt_span ( expected. def_id . node ) ) {
5457+ ( true , Some ( span) ) => {
5458+ self . sess . span_note ( span,
5459+ & format ! ( "a default was defined here..." ) ) ;
5460+ }
5461+ ( _, _) => {
5462+ let elems = csearch:: get_item_path ( self , expected. def_id )
5463+ . into_iter ( )
5464+ . map ( |p| p. to_string ( ) )
5465+ . collect :: < Vec < _ > > ( ) ;
5466+ self . sess . note (
5467+ & format ! ( "a default is defined on `{}`" ,
5468+ elems. join( "::" ) ) ) ;
5469+ }
5470+ }
5471+
54565472 self . sess . span_note ( expected. origin_span ,
5457- & format ! ( "...that was applied to an unconstrained type variable here" ) ) ;
5458- self . sess . span_note ( found. definition_span ,
5459- & format ! ( "a second default was defined here..." ) ) ;
5473+ & format ! ( "...that was applied to an unconstrained type variable here" ) ) ;
5474+
5475+ match ( found. def_id . krate == ast:: LOCAL_CRATE , self . map . opt_span ( found. def_id . node ) ) {
5476+ ( true , Some ( span) ) => {
5477+ self . sess . span_note ( span,
5478+ & format ! ( "a second default was defined here..." ) ) ;
5479+ }
5480+ ( _, _) => {
5481+ let elems = csearch:: get_item_path ( self , found. def_id )
5482+ . into_iter ( )
5483+ . map ( |p| p. to_string ( ) )
5484+ . collect :: < Vec < _ > > ( ) ;
5485+
5486+ self . sess . note (
5487+ & format ! ( "a second default is defined on `{}`" , elems. join( " " ) ) ) ;
5488+ }
5489+ }
5490+
54605491 self . sess . span_note ( found. origin_span ,
5461- & format ! ( "...that also applies to the same type variable here" ) ) ;
5492+ & format ! ( "...that also applies to the same type variable here" ) ) ;
54625493 }
54635494 _ => { }
54645495 }
0 commit comments