@@ -4,7 +4,7 @@ use std::{fmt, mem, sync::Arc};
44
55use chalk_ir:: {
66 cast:: Cast , fold:: TypeFoldable , interner:: HasInterner , zip:: Zip , CanonicalVarKind , FloatTy ,
7- IntTy , NoSolution , TyVariableKind , UniverseIndex ,
7+ IntTy , TyVariableKind , UniverseIndex ,
88} ;
99use chalk_solve:: infer:: ParameterEnaVariableExt ;
1010use ena:: unify:: UnifyKey ;
@@ -331,7 +331,6 @@ impl<'a> InferenceTable<'a> {
331331 & mut resolve:: Resolver { table : self , var_stack, fallback } ,
332332 DebruijnIndex :: INNERMOST ,
333333 )
334- . expect ( "fold failed unexpectedly" )
335334 }
336335
337336 pub ( crate ) fn resolve_completely < T > ( & mut self , t : T ) -> T
@@ -452,13 +451,14 @@ impl<'a> InferenceTable<'a> {
452451 f : impl FnOnce ( & mut Self ) -> T ,
453452 ) -> T {
454453 use chalk_ir:: fold:: TypeFolder ;
454+
455+ #[ derive( chalk_derive:: FallibleTypeFolder ) ]
456+ #[ has_interner( Interner ) ]
455457 struct VarFudger < ' a , ' b > {
456458 table : & ' a mut InferenceTable < ' b > ,
457459 highest_known_var : InferenceVar ,
458460 }
459461 impl < ' a , ' b > TypeFolder < Interner > for VarFudger < ' a , ' b > {
460- type Error = NoSolution ;
461-
462462 fn as_dyn ( & mut self ) -> & mut dyn TypeFolder < Interner , Error = Self :: Error > {
463463 self
464464 }
@@ -472,37 +472,37 @@ impl<'a> InferenceTable<'a> {
472472 var : chalk_ir:: InferenceVar ,
473473 kind : TyVariableKind ,
474474 _outer_binder : chalk_ir:: DebruijnIndex ,
475- ) -> chalk_ir:: Fallible < chalk_ir :: Ty < Interner > > {
476- Ok ( if var < self . highest_known_var {
475+ ) -> chalk_ir:: Ty < Interner > {
476+ if var < self . highest_known_var {
477477 var. to_ty ( Interner , kind)
478478 } else {
479479 self . table . new_type_var ( )
480- } )
480+ }
481481 }
482482
483483 fn fold_inference_lifetime (
484484 & mut self ,
485485 var : chalk_ir:: InferenceVar ,
486486 _outer_binder : chalk_ir:: DebruijnIndex ,
487- ) -> chalk_ir:: Fallible < chalk_ir :: Lifetime < Interner > > {
488- Ok ( if var < self . highest_known_var {
487+ ) -> chalk_ir:: Lifetime < Interner > {
488+ if var < self . highest_known_var {
489489 var. to_lifetime ( Interner )
490490 } else {
491491 self . table . new_lifetime_var ( )
492- } )
492+ }
493493 }
494494
495495 fn fold_inference_const (
496496 & mut self ,
497497 ty : chalk_ir:: Ty < Interner > ,
498498 var : chalk_ir:: InferenceVar ,
499499 _outer_binder : chalk_ir:: DebruijnIndex ,
500- ) -> chalk_ir:: Fallible < chalk_ir :: Const < Interner > > {
501- Ok ( if var < self . highest_known_var {
500+ ) -> chalk_ir:: Const < Interner > {
501+ if var < self . highest_known_var {
502502 var. to_const ( Interner , ty)
503503 } else {
504504 self . table . new_const_var ( ty)
505- } )
505+ }
506506 }
507507 }
508508
@@ -512,7 +512,6 @@ impl<'a> InferenceTable<'a> {
512512 self . rollback_to ( snapshot) ;
513513 result
514514 . fold_with ( & mut VarFudger { table : self , highest_known_var } , DebruijnIndex :: INNERMOST )
515- . expect ( "fold_with with VarFudger" )
516515 }
517516
518517 /// This checks whether any of the free variables in the `canonicalized`
@@ -639,21 +638,24 @@ mod resolve {
639638 use chalk_ir:: {
640639 cast:: Cast ,
641640 fold:: { TypeFoldable , TypeFolder } ,
642- Fallible , NoSolution ,
643641 } ;
644642 use hir_def:: type_ref:: ConstScalar ;
645643
646- pub ( super ) struct Resolver < ' a , ' b , F > {
644+ #[ derive( chalk_derive:: FallibleTypeFolder ) ]
645+ #[ has_interner( Interner ) ]
646+ pub ( super ) struct Resolver <
647+ ' a ,
648+ ' b ,
649+ F : Fn ( InferenceVar , VariableKind , GenericArg , DebruijnIndex ) -> GenericArg ,
650+ > {
647651 pub ( super ) table : & ' a mut InferenceTable < ' b > ,
648652 pub ( super ) var_stack : & ' a mut Vec < InferenceVar > ,
649653 pub ( super ) fallback : F ,
650654 }
651- impl < ' a , ' b , ' i , F > TypeFolder < Interner > for Resolver < ' a , ' b , F >
655+ impl < ' a , ' b , F > TypeFolder < Interner > for Resolver < ' a , ' b , F >
652656 where
653- F : Fn ( InferenceVar , VariableKind , GenericArg , DebruijnIndex ) -> GenericArg + ' i ,
657+ F : Fn ( InferenceVar , VariableKind , GenericArg , DebruijnIndex ) -> GenericArg ,
654658 {
655- type Error = NoSolution ;
656-
657659 fn as_dyn ( & mut self ) -> & mut dyn TypeFolder < Interner , Error = Self :: Error > {
658660 self
659661 }
@@ -667,20 +669,19 @@ mod resolve {
667669 var : InferenceVar ,
668670 kind : TyVariableKind ,
669671 outer_binder : DebruijnIndex ,
670- ) -> Fallible < Ty > {
672+ ) -> Ty {
671673 let var = self . table . var_unification_table . inference_var_root ( var) ;
672674 if self . var_stack . contains ( & var) {
673675 // recursive type
674676 let default = self . table . fallback_value ( var, kind) . cast ( Interner ) ;
675- return Ok ( ( self . fallback ) ( var, VariableKind :: Ty ( kind) , default, outer_binder)
677+ return ( self . fallback ) ( var, VariableKind :: Ty ( kind) , default, outer_binder)
676678 . assert_ty_ref ( Interner )
677- . clone ( ) ) ;
679+ . clone ( ) ;
678680 }
679681 let result = if let Some ( known_ty) = self . table . var_unification_table . probe_var ( var) {
680682 // known_ty may contain other variables that are known by now
681683 self . var_stack . push ( var) ;
682- let result =
683- known_ty. fold_with ( self , outer_binder) . expect ( "fold failed unexpectedly" ) ;
684+ let result = known_ty. fold_with ( self , outer_binder) ;
684685 self . var_stack . pop ( ) ;
685686 result. assert_ty_ref ( Interner ) . clone ( )
686687 } else {
@@ -689,15 +690,15 @@ mod resolve {
689690 . assert_ty_ref ( Interner )
690691 . clone ( )
691692 } ;
692- Ok ( result)
693+ result
693694 }
694695
695696 fn fold_inference_const (
696697 & mut self ,
697698 ty : Ty ,
698699 var : InferenceVar ,
699700 outer_binder : DebruijnIndex ,
700- ) -> Fallible < Const > {
701+ ) -> Const {
701702 let var = self . table . var_unification_table . inference_var_root ( var) ;
702703 let default = ConstData {
703704 ty : ty. clone ( ) ,
@@ -707,35 +708,33 @@ mod resolve {
707708 . cast ( Interner ) ;
708709 if self . var_stack . contains ( & var) {
709710 // recursive
710- return Ok ( ( self . fallback ) ( var, VariableKind :: Const ( ty) , default, outer_binder)
711+ return ( self . fallback ) ( var, VariableKind :: Const ( ty) , default, outer_binder)
711712 . assert_const_ref ( Interner )
712- . clone ( ) ) ;
713+ . clone ( ) ;
713714 }
714- let result = if let Some ( known_ty) = self . table . var_unification_table . probe_var ( var) {
715+ if let Some ( known_ty) = self . table . var_unification_table . probe_var ( var) {
715716 // known_ty may contain other variables that are known by now
716717 self . var_stack . push ( var) ;
717- let result =
718- known_ty. fold_with ( self , outer_binder) . expect ( "fold failed unexpectedly" ) ;
718+ let result = known_ty. fold_with ( self , outer_binder) ;
719719 self . var_stack . pop ( ) ;
720720 result. assert_const_ref ( Interner ) . clone ( )
721721 } else {
722722 ( self . fallback ) ( var, VariableKind :: Const ( ty) , default, outer_binder)
723723 . assert_const_ref ( Interner )
724724 . clone ( )
725- } ;
726- Ok ( result)
725+ }
727726 }
728727
729728 fn fold_inference_lifetime (
730729 & mut self ,
731730 _var : InferenceVar ,
732731 _outer_binder : DebruijnIndex ,
733- ) -> Fallible < Lifetime > {
732+ ) -> Lifetime {
734733 // fall back all lifetimes to 'static -- currently we don't deal
735734 // with any lifetimes, but we can sometimes get some lifetime
736735 // variables through Chalk's unification, and this at least makes
737736 // sure we don't leak them outside of inference
738- Ok ( crate :: static_lifetime ( ) )
737+ crate :: static_lifetime ( )
739738 }
740739 }
741740}
0 commit comments