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