@@ -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