@@ -824,7 +824,9 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
824824fn  cmp_fn_sig ( 
825825        & self , 
826826        sig1 :  & ty:: PolyFnSig < ' tcx > , 
827+         fn_def1 :  Option < ( DefId ,  & ' tcx  [ ty:: GenericArg < ' tcx > ] ) > , 
827828        sig2 :  & ty:: PolyFnSig < ' tcx > , 
829+         fn_def2 :  Option < ( DefId ,  & ' tcx  [ ty:: GenericArg < ' tcx > ] ) > , 
828830    )  -> ( DiagStyledString ,  DiagStyledString )  { 
829831        let  sig1 = & ( self . normalize_fn_sig ) ( * sig1) ; 
830832        let  sig2 = & ( self . normalize_fn_sig ) ( * sig2) ; 
@@ -930,6 +932,25 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
930932            ( values. 1 ) . 0 . extend ( x2. 0 ) ; 
931933        } 
932934
935+         let  fmt = |( did,  args) | format ! ( " {{{}}}" ,  self . tcx. def_path_str_with_args( did,  args) ) ; 
936+ 
937+         match  ( fn_def1,  fn_def2)  { 
938+             ( None ,  None )  => { } 
939+             ( Some ( fn_def1) ,  Some ( fn_def2) )  => { 
940+                 let  path1 = fmt ( fn_def1) ; 
941+                 let  path2 = fmt ( fn_def2) ; 
942+                 let  same_path = path1 == path2; 
943+                 values. 0 . push ( path1,  !same_path) ; 
944+                 values. 1 . push ( path2,  !same_path) ; 
945+             } 
946+             ( Some ( fn_def1) ,  None )  => { 
947+                 values. 0 . push_highlighted ( fmt ( fn_def1) ) ; 
948+             } 
949+             ( None ,  Some ( fn_def2) )  => { 
950+                 values. 1 . push_highlighted ( fmt ( fn_def2) ) ; 
951+             } 
952+         } 
953+ 
933954        values
934955    } 
935956
@@ -1318,36 +1339,21 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
13181339            ( ty:: FnDef ( did1,  args1) ,  ty:: FnDef ( did2,  args2) )  => { 
13191340                let  sig1 = self . tcx . fn_sig ( * did1) . instantiate ( self . tcx ,  args1) ; 
13201341                let  sig2 = self . tcx . fn_sig ( * did2) . instantiate ( self . tcx ,  args2) ; 
1321-                 let  mut  values = self . cmp_fn_sig ( & sig1,  & sig2) ; 
1322-                 let  path1 = format ! ( " {{{}}}" ,  self . tcx. def_path_str_with_args( * did1,  args1) ) ; 
1323-                 let  path2 = format ! ( " {{{}}}" ,  self . tcx. def_path_str_with_args( * did2,  args2) ) ; 
1324-                 let  same_path = path1 == path2; 
1325-                 values. 0 . push ( path1,  !same_path) ; 
1326-                 values. 1 . push ( path2,  !same_path) ; 
1327-                 values
1342+                 self . cmp_fn_sig ( & sig1,  Some ( ( * did1,  args1) ) ,  & sig2,  Some ( ( * did2,  args2) ) ) 
13281343            } 
13291344
13301345            ( ty:: FnDef ( did1,  args1) ,  ty:: FnPtr ( sig_tys2,  hdr2) )  => { 
13311346                let  sig1 = self . tcx . fn_sig ( * did1) . instantiate ( self . tcx ,  args1) ; 
1332-                 let  mut  values = self . cmp_fn_sig ( & sig1,  & sig_tys2. with ( * hdr2) ) ; 
1333-                 values. 0 . push_highlighted ( format ! ( 
1334-                     " {{{}}}" , 
1335-                     self . tcx. def_path_str_with_args( * did1,  args1) 
1336-                 ) ) ; 
1337-                 values
1347+                 self . cmp_fn_sig ( & sig1,  Some ( ( * did1,  args1) ) ,  & sig_tys2. with ( * hdr2) ,  None ) 
13381348            } 
13391349
13401350            ( ty:: FnPtr ( sig_tys1,  hdr1) ,  ty:: FnDef ( did2,  args2) )  => { 
13411351                let  sig2 = self . tcx . fn_sig ( * did2) . instantiate ( self . tcx ,  args2) ; 
1342-                 let  mut  values = self . cmp_fn_sig ( & sig_tys1. with ( * hdr1) ,  & sig2) ; 
1343-                 values
1344-                     . 1 
1345-                     . push_normal ( format ! ( " {{{}}}" ,  self . tcx. def_path_str_with_args( * did2,  args2) ) ) ; 
1346-                 values
1352+                 self . cmp_fn_sig ( & sig_tys1. with ( * hdr1) ,  None ,  & sig2,  Some ( ( * did2,  args2) ) ) 
13471353            } 
13481354
13491355            ( ty:: FnPtr ( sig_tys1,  hdr1) ,  ty:: FnPtr ( sig_tys2,  hdr2) )  => { 
1350-                 self . cmp_fn_sig ( & sig_tys1. with ( * hdr1) ,  & sig_tys2. with ( * hdr2) ) 
1356+                 self . cmp_fn_sig ( & sig_tys1. with ( * hdr1) ,  None ,   & sig_tys2. with ( * hdr2) ,   None ) 
13511357            } 
13521358
13531359            _ => { 
@@ -2102,7 +2108,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
21022108                if  exp_found. references_error ( )  { 
21032109                    return  None ; 
21042110                } 
2105-                 let  ( exp,  fnd)  = self . cmp_fn_sig ( & exp_found. expected ,  & exp_found. found ) ; 
2111+                 let  ( exp,  fnd)  = self . cmp_fn_sig ( & exp_found. expected ,  None ,   & exp_found. found ,   None ) ; 
21062112                Some ( ( exp,  fnd,  None ) ) 
21072113            } 
21082114        } 
0 commit comments