8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- use super :: { MethodError , Ambiguity , NoMatch } ;
11
+ use super :: { MethodError } ;
12
12
use super :: MethodIndex ;
13
13
use super :: { CandidateSource , ImplSource , TraitSource } ;
14
14
use super :: suggest;
@@ -129,7 +129,7 @@ pub fn probe<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
129
129
// take place in the `fcx.infcx().probe` below.
130
130
let steps = match create_steps ( fcx, span, self_ty) {
131
131
Some ( steps) => steps,
132
- None => return Err ( NoMatch ( Vec :: new ( ) , Vec :: new ( ) ) ) ,
132
+ None => return Err ( MethodError :: NoMatch ( Vec :: new ( ) , Vec :: new ( ) ) ) ,
133
133
} ;
134
134
135
135
// Create a list of simplified self types, if we can.
@@ -158,7 +158,7 @@ pub fn probe<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
158
158
let ( steps, opt_simplified_steps) = dummy. take ( ) . unwrap ( ) ;
159
159
let mut probe_cx = ProbeContext :: new ( fcx, span, method_name, steps, opt_simplified_steps) ;
160
160
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) ) ;
162
162
probe_cx. pick ( )
163
163
} )
164
164
}
@@ -444,29 +444,34 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
444
444
445
445
fn assemble_extension_candidates_for_traits_in_scope ( & mut self ,
446
446
expr_id : ast:: NodeId )
447
+ -> Result < ( ) , MethodError >
447
448
{
448
449
let mut duplicates = HashSet :: new ( ) ;
449
450
let opt_applicable_traits = self . fcx . ccx . trait_map . get ( & expr_id) ;
450
451
for applicable_traits in opt_applicable_traits. into_iter ( ) {
451
452
for & trait_did in applicable_traits. iter ( ) {
452
453
if duplicates. insert ( trait_did) {
453
- self . assemble_extension_candidates_for_trait ( trait_did) ;
454
+ try! ( self . assemble_extension_candidates_for_trait ( trait_did) ) ;
454
455
}
455
456
}
456
457
}
458
+ Ok ( ( ) )
457
459
}
458
460
459
- fn assemble_extension_candidates_for_all_traits ( & mut self ) {
461
+ fn assemble_extension_candidates_for_all_traits ( & mut self ) -> Result < ( ) , MethodError > {
460
462
let mut duplicates = HashSet :: new ( ) ;
461
463
for trait_info in suggest:: all_traits ( self . fcx . ccx ) {
462
464
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 ) ) ;
464
466
}
465
467
}
468
+ Ok ( ( ) )
466
469
}
467
470
468
471
fn assemble_extension_candidates_for_trait ( & mut self ,
469
- trait_def_id : ast:: DefId ) {
472
+ trait_def_id : ast:: DefId )
473
+ -> Result < ( ) , MethodError >
474
+ {
470
475
debug ! ( "assemble_extension_candidates_for_trait(trait_def_id={})" ,
471
476
trait_def_id. repr( self . tcx( ) ) ) ;
472
477
@@ -478,26 +483,27 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
478
483
. position ( |item| item. name ( ) == self . method_name ) ;
479
484
let matching_index = match matching_index {
480
485
Some ( i) => i,
481
- None => { return ; }
486
+ None => { return Ok ( ( ) ) ; }
482
487
} ;
483
488
let method = match ( & * trait_items) [ matching_index] . as_opt_method ( ) {
484
489
Some ( m) => m,
485
- None => { return ; }
490
+ None => { return Ok ( ( ) ) ; }
486
491
} ;
487
492
488
493
// Check whether `trait_def_id` defines a method with suitable name:
489
494
if !self . has_applicable_self ( & * method) {
490
495
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 ( ( ) ) ;
492
498
}
493
499
494
500
self . assemble_extension_candidates_for_trait_impls ( trait_def_id,
495
501
method. clone ( ) ,
496
502
matching_index) ;
497
503
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) ) ;
501
507
502
508
self . assemble_projection_candidates ( trait_def_id,
503
509
method. clone ( ) ,
@@ -506,6 +512,8 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
506
512
self . assemble_where_clause_candidates ( trait_def_id,
507
513
method,
508
514
matching_index) ;
515
+
516
+ Ok ( ( ) )
509
517
}
510
518
511
519
fn assemble_extension_candidates_for_trait_impls ( & mut self ,
@@ -576,6 +584,7 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
576
584
trait_def_id : ast:: DefId ,
577
585
method_ty : Rc < ty:: Method < ' tcx > > ,
578
586
method_index : uint )
587
+ -> Result < ( ) , MethodError >
579
588
{
580
589
// Check if this is one of the Fn,FnMut,FnOnce traits.
581
590
let tcx = self . tcx ( ) ;
@@ -586,7 +595,7 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
586
595
} else if Some ( trait_def_id) == tcx. lang_items . fn_once_trait ( ) {
587
596
ty:: FnOnceClosureKind
588
597
} else {
589
- return ;
598
+ return Ok ( ( ) ) ;
590
599
} ;
591
600
592
601
// Check if there is an unboxed-closure self-type in the list of receivers.
@@ -602,10 +611,7 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
602
611
let closure_kind = match closure_kinds. get ( & closure_def_id) {
603
612
Some ( & k) => k,
604
613
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) ) ;
609
615
}
610
616
} ;
611
617
@@ -630,6 +636,8 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
630
636
kind : ClosureCandidate ( trait_def_id, method_index)
631
637
} ) ;
632
638
}
639
+
640
+ Ok ( ( ) )
633
641
}
634
642
635
643
fn assemble_projection_candidates ( & mut self ,
@@ -735,11 +743,11 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
735
743
let span = self . span ;
736
744
let tcx = self . tcx ( ) ;
737
745
738
- self . assemble_extension_candidates_for_all_traits ( ) ;
746
+ try! ( self . assemble_extension_candidates_for_all_traits ( ) ) ;
739
747
740
748
let out_of_scope_traits = match self . pick_core ( ) {
741
749
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| {
743
751
match source {
744
752
TraitSource ( id) => id,
745
753
ImplSource ( impl_id) => {
@@ -752,14 +760,18 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
752
760
}
753
761
}
754
762
} ) . collect ( ) ,
755
- Some ( Err ( NoMatch ( _, others) ) ) => {
763
+ Some ( Err ( MethodError :: NoMatch ( _, others) ) ) => {
756
764
assert ! ( others. is_empty( ) ) ;
757
765
vec ! [ ]
758
766
}
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
+ }
759
771
None => vec ! [ ] ,
760
772
} ;
761
- ;
762
- Err ( NoMatch ( static_candidates, out_of_scope_traits) )
773
+
774
+ Err ( MethodError :: NoMatch ( static_candidates, out_of_scope_traits) )
763
775
}
764
776
765
777
fn pick_core ( & mut self ) -> Option < PickResult < ' tcx > > {
@@ -895,7 +907,7 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
895
907
896
908
if applicable_candidates. len ( ) > 1 {
897
909
let sources = probes. iter ( ) . map ( |p| p. to_source ( ) ) . collect ( ) ;
898
- return Some ( Err ( Ambiguity ( sources) ) ) ;
910
+ return Some ( Err ( MethodError :: Ambiguity ( sources) ) ) ;
899
911
}
900
912
901
913
applicable_candidates. pop ( ) . map ( |probe| {
0 commit comments