88// option. This file may not be copied, modified, or distributed
99// except according to those terms.
1010
11- use super :: { MethodError , Ambiguity , NoMatch } ;
11+ use super :: { MethodError } ;
1212use super :: MethodIndex ;
1313use super :: { CandidateSource , ImplSource , TraitSource } ;
1414use super :: suggest;
@@ -129,7 +129,7 @@ pub fn probe<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
129129 // take place in the `fcx.infcx().probe` below.
130130 let steps = match create_steps ( fcx, span, self_ty) {
131131 Some ( steps) => steps,
132- None => return Err ( NoMatch ( Vec :: new ( ) , Vec :: new ( ) ) ) ,
132+ None => return Err ( MethodError :: NoMatch ( Vec :: new ( ) , Vec :: new ( ) ) ) ,
133133 } ;
134134
135135 // Create a list of simplified self types, if we can.
@@ -158,7 +158,7 @@ pub fn probe<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
158158 let ( steps, opt_simplified_steps) = dummy. take ( ) . unwrap ( ) ;
159159 let mut probe_cx = ProbeContext :: new ( fcx, span, method_name, steps, opt_simplified_steps) ;
160160 probe_cx. assemble_inherent_candidates ( ) ;
161- probe_cx. assemble_extension_candidates_for_traits_in_scope ( call_expr_id) ;
161+ try! ( probe_cx. assemble_extension_candidates_for_traits_in_scope ( call_expr_id) ) ;
162162 probe_cx. pick ( )
163163 } )
164164}
@@ -444,29 +444,34 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
444444
445445 fn assemble_extension_candidates_for_traits_in_scope ( & mut self ,
446446 expr_id : ast:: NodeId )
447+ -> Result < ( ) , MethodError >
447448 {
448449 let mut duplicates = HashSet :: new ( ) ;
449450 let opt_applicable_traits = self . fcx . ccx . trait_map . get ( & expr_id) ;
450451 for applicable_traits in opt_applicable_traits. into_iter ( ) {
451452 for & trait_did in applicable_traits. iter ( ) {
452453 if duplicates. insert ( trait_did) {
453- self . assemble_extension_candidates_for_trait ( trait_did) ;
454+ try! ( self . assemble_extension_candidates_for_trait ( trait_did) ) ;
454455 }
455456 }
456457 }
458+ Ok ( ( ) )
457459 }
458460
459- fn assemble_extension_candidates_for_all_traits ( & mut self ) {
461+ fn assemble_extension_candidates_for_all_traits ( & mut self ) -> Result < ( ) , MethodError > {
460462 let mut duplicates = HashSet :: new ( ) ;
461463 for trait_info in suggest:: all_traits ( self . fcx . ccx ) {
462464 if duplicates. insert ( trait_info. def_id ) {
463- self . assemble_extension_candidates_for_trait ( trait_info. def_id )
465+ try! ( self . assemble_extension_candidates_for_trait ( trait_info. def_id ) ) ;
464466 }
465467 }
468+ Ok ( ( ) )
466469 }
467470
468471 fn assemble_extension_candidates_for_trait ( & mut self ,
469- trait_def_id : ast:: DefId ) {
472+ trait_def_id : ast:: DefId )
473+ -> Result < ( ) , MethodError >
474+ {
470475 debug ! ( "assemble_extension_candidates_for_trait(trait_def_id={})" ,
471476 trait_def_id. repr( self . tcx( ) ) ) ;
472477
@@ -478,26 +483,27 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
478483 . position ( |item| item. name ( ) == self . method_name ) ;
479484 let matching_index = match matching_index {
480485 Some ( i) => i,
481- None => { return ; }
486+ None => { return Ok ( ( ) ) ; }
482487 } ;
483488 let method = match ( & * trait_items) [ matching_index] . as_opt_method ( ) {
484489 Some ( m) => m,
485- None => { return ; }
490+ None => { return Ok ( ( ) ) ; }
486491 } ;
487492
488493 // Check whether `trait_def_id` defines a method with suitable name:
489494 if !self . has_applicable_self ( & * method) {
490495 debug ! ( "method has inapplicable self" ) ;
491- return self . record_static_candidate ( TraitSource ( trait_def_id) ) ;
496+ self . record_static_candidate ( TraitSource ( trait_def_id) ) ;
497+ return Ok ( ( ) ) ;
492498 }
493499
494500 self . assemble_extension_candidates_for_trait_impls ( trait_def_id,
495501 method. clone ( ) ,
496502 matching_index) ;
497503
498- self . assemble_closure_candidates ( trait_def_id,
499- method. clone ( ) ,
500- matching_index) ;
504+ try! ( self . assemble_closure_candidates ( trait_def_id,
505+ method. clone ( ) ,
506+ matching_index) ) ;
501507
502508 self . assemble_projection_candidates ( trait_def_id,
503509 method. clone ( ) ,
@@ -506,6 +512,8 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
506512 self . assemble_where_clause_candidates ( trait_def_id,
507513 method,
508514 matching_index) ;
515+
516+ Ok ( ( ) )
509517 }
510518
511519 fn assemble_extension_candidates_for_trait_impls ( & mut self ,
@@ -576,6 +584,7 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
576584 trait_def_id : ast:: DefId ,
577585 method_ty : Rc < ty:: Method < ' tcx > > ,
578586 method_index : uint )
587+ -> Result < ( ) , MethodError >
579588 {
580589 // Check if this is one of the Fn,FnMut,FnOnce traits.
581590 let tcx = self . tcx ( ) ;
@@ -586,7 +595,7 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
586595 } else if Some ( trait_def_id) == tcx. lang_items . fn_once_trait ( ) {
587596 ty:: FnOnceClosureKind
588597 } else {
589- return ;
598+ return Ok ( ( ) ) ;
590599 } ;
591600
592601 // Check if there is an unboxed-closure self-type in the list of receivers.
@@ -602,10 +611,7 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
602611 let closure_kind = match closure_kinds. get ( & closure_def_id) {
603612 Some ( & k) => k,
604613 None => {
605- self . tcx ( ) . sess . span_bug (
606- self . span ,
607- & format ! ( "No entry for closure: {}" ,
608- closure_def_id. repr( self . tcx( ) ) ) [ ] ) ;
614+ return Err ( MethodError :: ClosureAmbiguity ( trait_def_id) ) ;
609615 }
610616 } ;
611617
@@ -630,6 +636,8 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
630636 kind : ClosureCandidate ( trait_def_id, method_index)
631637 } ) ;
632638 }
639+
640+ Ok ( ( ) )
633641 }
634642
635643 fn assemble_projection_candidates ( & mut self ,
@@ -735,11 +743,11 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
735743 let span = self . span ;
736744 let tcx = self . tcx ( ) ;
737745
738- self . assemble_extension_candidates_for_all_traits ( ) ;
746+ try! ( self . assemble_extension_candidates_for_all_traits ( ) ) ;
739747
740748 let out_of_scope_traits = match self . pick_core ( ) {
741749 Some ( Ok ( p) ) => vec ! [ p. method_ty. container. id( ) ] ,
742- Some ( Err ( Ambiguity ( v) ) ) => v. into_iter ( ) . map ( |source| {
750+ Some ( Err ( MethodError :: Ambiguity ( v) ) ) => v. into_iter ( ) . map ( |source| {
743751 match source {
744752 TraitSource ( id) => id,
745753 ImplSource ( impl_id) => {
@@ -752,14 +760,18 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
752760 }
753761 }
754762 } ) . collect ( ) ,
755- Some ( Err ( NoMatch ( _, others) ) ) => {
763+ Some ( Err ( MethodError :: NoMatch ( _, others) ) ) => {
756764 assert ! ( others. is_empty( ) ) ;
757765 vec ! [ ]
758766 }
767+ Some ( Err ( MethodError :: ClosureAmbiguity ( ..) ) ) => {
768+ // this error only occurs when assembling candidates
769+ tcx. sess . span_bug ( span, "encountered ClosureAmbiguity from pick_core" ) ;
770+ }
759771 None => vec ! [ ] ,
760772 } ;
761- ;
762- Err ( NoMatch ( static_candidates, out_of_scope_traits) )
773+
774+ Err ( MethodError :: NoMatch ( static_candidates, out_of_scope_traits) )
763775 }
764776
765777 fn pick_core ( & mut self ) -> Option < PickResult < ' tcx > > {
@@ -895,7 +907,7 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
895907
896908 if applicable_candidates. len ( ) > 1 {
897909 let sources = probes. iter ( ) . map ( |p| p. to_source ( ) ) . collect ( ) ;
898- return Some ( Err ( Ambiguity ( sources) ) ) ;
910+ return Some ( Err ( MethodError :: Ambiguity ( sources) ) ) ;
899911 }
900912
901913 applicable_candidates. pop ( ) . map ( |probe| {
0 commit comments