@@ -311,9 +311,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
311311 self . sess ( ) . span_err ( span, & msg) ;
312312 }
313313
314- MethodError :: PrivateMatch ( def) => {
315- struct_span_err ! ( self . tcx. sess, span, E0624 ,
316- "{} `{}` is private" , def. kind_name( ) , item_name) . emit ( ) ;
314+ MethodError :: PrivateMatch ( def, out_of_scope_traits) => {
315+ let mut err = struct_span_err ! ( self . tcx. sess, span, E0624 ,
316+ "{} `{}` is private" , def. kind_name( ) , item_name) ;
317+ self . suggest_valid_traits ( & mut err, out_of_scope_traits) ;
318+ err. emit ( ) ;
317319 }
318320
319321 MethodError :: IllegalSizedBound ( candidates) => {
@@ -353,13 +355,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
353355 err. note ( & msg[ ..] ) ;
354356 }
355357
356- fn suggest_traits_to_import ( & self ,
357- err : & mut DiagnosticBuilder ,
358- span : Span ,
359- rcvr_ty : Ty < ' tcx > ,
360- item_name : ast:: Name ,
361- rcvr_expr : Option < & hir:: Expr > ,
362- valid_out_of_scope_traits : Vec < DefId > ) {
358+ fn suggest_valid_traits ( & self ,
359+ err : & mut DiagnosticBuilder ,
360+ valid_out_of_scope_traits : Vec < DefId > ) -> bool {
363361 if !valid_out_of_scope_traits. is_empty ( ) {
364362 let mut candidates = valid_out_of_scope_traits;
365363 candidates. sort ( ) ;
@@ -379,6 +377,20 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
379377 } ) ;
380378
381379 self . suggest_use_candidates ( err, msg, candidates) ;
380+ true
381+ } else {
382+ false
383+ }
384+ }
385+
386+ fn suggest_traits_to_import ( & self ,
387+ err : & mut DiagnosticBuilder ,
388+ span : Span ,
389+ rcvr_ty : Ty < ' tcx > ,
390+ item_name : ast:: Name ,
391+ rcvr_expr : Option < & hir:: Expr > ,
392+ valid_out_of_scope_traits : Vec < DefId > ) {
393+ if self . suggest_valid_traits ( err, valid_out_of_scope_traits) {
382394 return ;
383395 }
384396
0 commit comments