@@ -249,12 +249,12 @@ pub trait ErrorReporting<'tcx> {
249249 terr : & TypeError < ' tcx > )
250250 -> DiagnosticBuilder < ' tcx > ;
251251
252- fn values_str ( & self , values : & ValuePairs < ' tcx > ) -> Option < String > ;
252+ fn values_str ( & self , values : & ValuePairs < ' tcx > ) -> Option < ( String , String ) > ;
253253
254254 fn expected_found_str < T : fmt:: Display + Resolvable < ' tcx > + TypeFoldable < ' tcx > > (
255255 & self ,
256256 exp_found : & ty:: error:: ExpectedFound < T > )
257- -> Option < String > ;
257+ -> Option < ( String , String ) > ;
258258
259259 fn report_concrete_failure ( & self ,
260260 origin : SubregionOrigin < ' tcx > ,
@@ -535,7 +535,7 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
535535 trace : TypeTrace < ' tcx > ,
536536 terr : & TypeError < ' tcx > )
537537 -> DiagnosticBuilder < ' tcx > {
538- let expected_found_str = match self . values_str ( & trace. values ) {
538+ let ( expected , found ) = match self . values_str ( & trace. values ) {
539539 Some ( v) => v,
540540 None => {
541541 return self . tcx . sess . diagnostic ( ) . struct_dummy ( ) ; /* derived error */
@@ -548,18 +548,17 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
548548 false
549549 } ;
550550
551- let expected_found_str = if is_simple_error {
552- expected_found_str
553- } else {
554- format ! ( "{} ({})" , expected_found_str, terr)
555- } ;
556-
557551 let mut err = struct_span_err ! ( self . tcx. sess,
558552 trace. origin. span( ) ,
559553 E0308 ,
560- "{}: {}" ,
561- trace. origin,
562- expected_found_str) ;
554+ "{}" ,
555+ trace. origin) ;
556+
557+ if !is_simple_error {
558+ err = err. note_expected_found ( & "type" , & expected, & found) ;
559+ }
560+
561+ err = err. span_label ( trace. origin . span ( ) , & terr) ;
563562
564563 self . check_and_note_conflicting_crates ( & mut err, terr, trace. origin . span ( ) ) ;
565564
@@ -574,6 +573,7 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
574573 } ,
575574 _ => ( )
576575 }
576+
577577 err
578578 }
579579
@@ -631,7 +631,7 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
631631
632632 /// Returns a string of the form "expected `{}`, found `{}`", or None if this is a derived
633633 /// error.
634- fn values_str ( & self , values : & ValuePairs < ' tcx > ) -> Option < String > {
634+ fn values_str ( & self , values : & ValuePairs < ' tcx > ) -> Option < ( String , String ) > {
635635 match * values {
636636 infer:: Types ( ref exp_found) => self . expected_found_str ( exp_found) ,
637637 infer:: TraitRefs ( ref exp_found) => self . expected_found_str ( exp_found) ,
@@ -642,7 +642,7 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
642642 fn expected_found_str < T : fmt:: Display + Resolvable < ' tcx > + TypeFoldable < ' tcx > > (
643643 & self ,
644644 exp_found : & ty:: error:: ExpectedFound < T > )
645- -> Option < String >
645+ -> Option < ( String , String ) >
646646 {
647647 let expected = exp_found. expected . resolve ( self ) ;
648648 if expected. references_error ( ) {
@@ -654,9 +654,7 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
654654 return None ;
655655 }
656656
657- Some ( format ! ( "expected `{}`, found `{}`" ,
658- expected,
659- found) )
657+ Some ( ( format ! ( "{}" , expected) , format ! ( "{}" , found) ) )
660658 }
661659
662660 fn report_generic_bound_failure ( & self ,
@@ -684,10 +682,9 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
684682 E0309 ,
685683 "{} may not live long enough" ,
686684 labeled_user_string) ;
687- err. fileline_help ( origin. span ( ) ,
688- & format ! ( "consider adding an explicit lifetime bound `{}: {}`..." ,
689- bound_kind,
690- sub) ) ;
685+ err. help ( & format ! ( "consider adding an explicit lifetime bound `{}: {}`..." ,
686+ bound_kind,
687+ sub) ) ;
691688 err
692689 }
693690
@@ -698,10 +695,9 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
698695 E0310 ,
699696 "{} may not live long enough" ,
700697 labeled_user_string) ;
701- err. fileline_help ( origin. span ( ) ,
702- & format ! ( "consider adding an explicit lifetime \
703- bound `{}: 'static`...",
704- bound_kind) ) ;
698+ err. help ( & format ! ( "consider adding an explicit lifetime \
699+ bound `{}: 'static`...",
700+ bound_kind) ) ;
705701 err
706702 }
707703
@@ -712,9 +708,8 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
712708 E0311 ,
713709 "{} may not live long enough" ,
714710 labeled_user_string) ;
715- err. fileline_help ( origin. span ( ) ,
716- & format ! ( "consider adding an explicit lifetime bound for `{}`" ,
717- bound_kind) ) ;
711+ err. help ( & format ! ( "consider adding an explicit lifetime bound for `{}`" ,
712+ bound_kind) ) ;
718713 self . tcx . note_and_explain_region (
719714 & mut err,
720715 & format ! ( "{} must be valid for " , labeled_user_string) ,
@@ -1751,11 +1746,11 @@ impl<'a, 'tcx> ErrorReportingHelpers<'tcx> for InferCtxt<'a, 'tcx> {
17511746 } ;
17521747
17531748 match self . values_str ( & trace. values ) {
1754- Some ( values_str ) => {
1749+ Some ( ( expected , found ) ) => {
17551750 err. span_note (
17561751 trace. origin . span ( ) ,
1757- & format ! ( "...so that {} ({})" ,
1758- desc, values_str ) ) ;
1752+ & format ! ( "...so that {} (expected {}, found {})" ,
1753+ desc, expected , found ) ) ;
17591754 }
17601755 None => {
17611756 // Really should avoid printing this error at
0 commit comments