@@ -4,7 +4,7 @@ use std::{fmt, mem, sync::Arc};
4
4
5
5
use chalk_ir:: {
6
6
cast:: Cast , fold:: TypeFoldable , interner:: HasInterner , zip:: Zip , CanonicalVarKind , FloatTy ,
7
- IntTy , NoSolution , TyVariableKind , UniverseIndex ,
7
+ IntTy , TyVariableKind , UniverseIndex ,
8
8
} ;
9
9
use chalk_solve:: infer:: ParameterEnaVariableExt ;
10
10
use ena:: unify:: UnifyKey ;
@@ -331,7 +331,6 @@ impl<'a> InferenceTable<'a> {
331
331
& mut resolve:: Resolver { table : self , var_stack, fallback } ,
332
332
DebruijnIndex :: INNERMOST ,
333
333
)
334
- . expect ( "fold failed unexpectedly" )
335
334
}
336
335
337
336
pub ( crate ) fn resolve_completely < T > ( & mut self , t : T ) -> T
@@ -452,13 +451,14 @@ impl<'a> InferenceTable<'a> {
452
451
f : impl FnOnce ( & mut Self ) -> T ,
453
452
) -> T {
454
453
use chalk_ir:: fold:: TypeFolder ;
454
+
455
+ #[ derive( chalk_derive:: FallibleTypeFolder ) ]
456
+ #[ has_interner( Interner ) ]
455
457
struct VarFudger < ' a , ' b > {
456
458
table : & ' a mut InferenceTable < ' b > ,
457
459
highest_known_var : InferenceVar ,
458
460
}
459
461
impl < ' a , ' b > TypeFolder < Interner > for VarFudger < ' a , ' b > {
460
- type Error = NoSolution ;
461
-
462
462
fn as_dyn ( & mut self ) -> & mut dyn TypeFolder < Interner , Error = Self :: Error > {
463
463
self
464
464
}
@@ -472,37 +472,37 @@ impl<'a> InferenceTable<'a> {
472
472
var : chalk_ir:: InferenceVar ,
473
473
kind : TyVariableKind ,
474
474
_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 {
477
477
var. to_ty ( Interner , kind)
478
478
} else {
479
479
self . table . new_type_var ( )
480
- } )
480
+ }
481
481
}
482
482
483
483
fn fold_inference_lifetime (
484
484
& mut self ,
485
485
var : chalk_ir:: InferenceVar ,
486
486
_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 {
489
489
var. to_lifetime ( Interner )
490
490
} else {
491
491
self . table . new_lifetime_var ( )
492
- } )
492
+ }
493
493
}
494
494
495
495
fn fold_inference_const (
496
496
& mut self ,
497
497
ty : chalk_ir:: Ty < Interner > ,
498
498
var : chalk_ir:: InferenceVar ,
499
499
_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 {
502
502
var. to_const ( Interner , ty)
503
503
} else {
504
504
self . table . new_const_var ( ty)
505
- } )
505
+ }
506
506
}
507
507
}
508
508
@@ -512,7 +512,6 @@ impl<'a> InferenceTable<'a> {
512
512
self . rollback_to ( snapshot) ;
513
513
result
514
514
. fold_with ( & mut VarFudger { table : self , highest_known_var } , DebruijnIndex :: INNERMOST )
515
- . expect ( "fold_with with VarFudger" )
516
515
}
517
516
518
517
/// This checks whether any of the free variables in the `canonicalized`
@@ -639,21 +638,24 @@ mod resolve {
639
638
use chalk_ir:: {
640
639
cast:: Cast ,
641
640
fold:: { TypeFoldable , TypeFolder } ,
642
- Fallible , NoSolution ,
643
641
} ;
644
642
use hir_def:: type_ref:: ConstScalar ;
645
643
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
+ > {
647
651
pub ( super ) table : & ' a mut InferenceTable < ' b > ,
648
652
pub ( super ) var_stack : & ' a mut Vec < InferenceVar > ,
649
653
pub ( super ) fallback : F ,
650
654
}
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 >
652
656
where
653
- F : Fn ( InferenceVar , VariableKind , GenericArg , DebruijnIndex ) -> GenericArg + ' i ,
657
+ F : Fn ( InferenceVar , VariableKind , GenericArg , DebruijnIndex ) -> GenericArg ,
654
658
{
655
- type Error = NoSolution ;
656
-
657
659
fn as_dyn ( & mut self ) -> & mut dyn TypeFolder < Interner , Error = Self :: Error > {
658
660
self
659
661
}
@@ -667,20 +669,19 @@ mod resolve {
667
669
var : InferenceVar ,
668
670
kind : TyVariableKind ,
669
671
outer_binder : DebruijnIndex ,
670
- ) -> Fallible < Ty > {
672
+ ) -> Ty {
671
673
let var = self . table . var_unification_table . inference_var_root ( var) ;
672
674
if self . var_stack . contains ( & var) {
673
675
// recursive type
674
676
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)
676
678
. assert_ty_ref ( Interner )
677
- . clone ( ) ) ;
679
+ . clone ( ) ;
678
680
}
679
681
let result = if let Some ( known_ty) = self . table . var_unification_table . probe_var ( var) {
680
682
// known_ty may contain other variables that are known by now
681
683
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) ;
684
685
self . var_stack . pop ( ) ;
685
686
result. assert_ty_ref ( Interner ) . clone ( )
686
687
} else {
@@ -689,15 +690,15 @@ mod resolve {
689
690
. assert_ty_ref ( Interner )
690
691
. clone ( )
691
692
} ;
692
- Ok ( result)
693
+ result
693
694
}
694
695
695
696
fn fold_inference_const (
696
697
& mut self ,
697
698
ty : Ty ,
698
699
var : InferenceVar ,
699
700
outer_binder : DebruijnIndex ,
700
- ) -> Fallible < Const > {
701
+ ) -> Const {
701
702
let var = self . table . var_unification_table . inference_var_root ( var) ;
702
703
let default = ConstData {
703
704
ty : ty. clone ( ) ,
@@ -707,35 +708,33 @@ mod resolve {
707
708
. cast ( Interner ) ;
708
709
if self . var_stack . contains ( & var) {
709
710
// recursive
710
- return Ok ( ( self . fallback ) ( var, VariableKind :: Const ( ty) , default, outer_binder)
711
+ return ( self . fallback ) ( var, VariableKind :: Const ( ty) , default, outer_binder)
711
712
. assert_const_ref ( Interner )
712
- . clone ( ) ) ;
713
+ . clone ( ) ;
713
714
}
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) {
715
716
// known_ty may contain other variables that are known by now
716
717
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) ;
719
719
self . var_stack . pop ( ) ;
720
720
result. assert_const_ref ( Interner ) . clone ( )
721
721
} else {
722
722
( self . fallback ) ( var, VariableKind :: Const ( ty) , default, outer_binder)
723
723
. assert_const_ref ( Interner )
724
724
. clone ( )
725
- } ;
726
- Ok ( result)
725
+ }
727
726
}
728
727
729
728
fn fold_inference_lifetime (
730
729
& mut self ,
731
730
_var : InferenceVar ,
732
731
_outer_binder : DebruijnIndex ,
733
- ) -> Fallible < Lifetime > {
732
+ ) -> Lifetime {
734
733
// fall back all lifetimes to 'static -- currently we don't deal
735
734
// with any lifetimes, but we can sometimes get some lifetime
736
735
// variables through Chalk's unification, and this at least makes
737
736
// sure we don't leak them outside of inference
738
- Ok ( crate :: static_lifetime ( ) )
737
+ crate :: static_lifetime ( )
739
738
}
740
739
}
741
740
}
0 commit comments