@@ -58,20 +58,24 @@ pub trait Folder<'i, I: Interner>
5858where
5959 I : ' i ,
6060{
61+ /// The type this folder returns when folding fails. This is
62+ /// commonly [`NoSolution`].
63+ type Error ;
64+
6165 /// Creates a `dyn` value from this folder. Unfortunately, this
6266 /// must be added manually to each impl of Folder; it permits the
6367 /// default implements below to create a `&mut dyn Folder` from
6468 /// `Self` without knowing what `Self` is (by invoking this
6569 /// method). Effectively, this limits impls of `Folder` to types
6670 /// for which we are able to create a dyn value (i.e., not `[T]`
6771 /// types).
68- fn as_dyn ( & mut self ) -> & mut dyn Folder < ' i , I > ;
72+ fn as_dyn ( & mut self ) -> & mut dyn Folder < ' i , I , Error = Self :: Error > ;
6973
7074 /// Top-level callback: invoked for each `Ty<I>` that is
7175 /// encountered when folding. By default, invokes
7276 /// `super_fold_with`, which will in turn invoke the more
7377 /// specialized folding methods below, like `fold_free_var_ty`.
74- fn fold_ty ( & mut self , ty : Ty < I > , outer_binder : DebruijnIndex ) -> Fallible < Ty < I > > {
78+ fn fold_ty ( & mut self , ty : Ty < I > , outer_binder : DebruijnIndex ) -> Result < Ty < I > , Self :: Error > {
7579 ty. super_fold_with ( self . as_dyn ( ) , outer_binder)
7680 }
7781
8387 & mut self ,
8488 lifetime : Lifetime < I > ,
8589 outer_binder : DebruijnIndex ,
86- ) -> Fallible < Lifetime < I > > {
90+ ) -> Result < Lifetime < I > , Self :: Error > {
8791 lifetime. super_fold_with ( self . as_dyn ( ) , outer_binder)
8892 }
8993
9599 & mut self ,
96100 constant : Const < I > ,
97101 outer_binder : DebruijnIndex ,
98- ) -> Fallible < Const < I > > {
102+ ) -> Result < Const < I > , Self :: Error > {
99103 constant. super_fold_with ( self . as_dyn ( ) , outer_binder)
100104 }
101105
@@ -104,12 +108,16 @@ where
104108 & mut self ,
105109 clause : ProgramClause < I > ,
106110 outer_binder : DebruijnIndex ,
107- ) -> Fallible < ProgramClause < I > > {
111+ ) -> Result < ProgramClause < I > , Self :: Error > {
108112 clause. super_fold_with ( self . as_dyn ( ) , outer_binder)
109113 }
110114
111115 /// Invoked for every goal. By default, recursively folds the goals contents.
112- fn fold_goal ( & mut self , goal : Goal < I > , outer_binder : DebruijnIndex ) -> Fallible < Goal < I > > {
116+ fn fold_goal (
117+ & mut self ,
118+ goal : Goal < I > ,
119+ outer_binder : DebruijnIndex ,
120+ ) -> Result < Goal < I > , Self :: Error > {
113121 goal. super_fold_with ( self . as_dyn ( ) , outer_binder)
114122 }
115123
@@ -133,7 +141,7 @@ where
133141 & mut self ,
134142 bound_var : BoundVar ,
135143 outer_binder : DebruijnIndex ,
136- ) -> Fallible < Ty < I > > {
144+ ) -> Result < Ty < I > , Self :: Error > {
137145 if self . forbid_free_vars ( ) {
138146 panic ! (
139147 "unexpected free variable with depth `{:?}` with outer binder {:?}" ,
@@ -150,7 +158,7 @@ where
150158 & mut self ,
151159 bound_var : BoundVar ,
152160 outer_binder : DebruijnIndex ,
153- ) -> Fallible < Lifetime < I > > {
161+ ) -> Result < Lifetime < I > , Self :: Error > {
154162 if self . forbid_free_vars ( ) {
155163 panic ! (
156164 "unexpected free variable with depth `{:?}` with outer binder {:?}" ,
@@ -168,7 +176,7 @@ where
168176 ty : Ty < I > ,
169177 bound_var : BoundVar ,
170178 outer_binder : DebruijnIndex ,
171- ) -> Fallible < Const < I > > {
179+ ) -> Result < Const < I > , Self :: Error > {
172180 if self . forbid_free_vars ( ) {
173181 panic ! (
174182 "unexpected free variable with depth `{:?}` with outer binder {:?}" ,
@@ -202,7 +210,7 @@ where
202210 & mut self ,
203211 universe : PlaceholderIndex ,
204212 outer_binder : DebruijnIndex ,
205- ) -> Fallible < Ty < I > > {
213+ ) -> Result < Ty < I > , Self :: Error > {
206214 if self . forbid_free_placeholders ( ) {
207215 panic ! ( "unexpected placeholder type `{:?}`" , universe)
208216 } else {
@@ -216,7 +224,7 @@ where
216224 & mut self ,
217225 universe : PlaceholderIndex ,
218226 outer_binder : DebruijnIndex ,
219- ) -> Fallible < Lifetime < I > > {
227+ ) -> Result < Lifetime < I > , Self :: Error > {
220228 if self . forbid_free_placeholders ( ) {
221229 panic ! ( "unexpected placeholder lifetime `{:?}`" , universe)
222230 } else {
@@ -231,7 +239,7 @@ where
231239 ty : Ty < I > ,
232240 universe : PlaceholderIndex ,
233241 outer_binder : DebruijnIndex ,
234- ) -> Fallible < Const < I > > {
242+ ) -> Result < Const < I > , Self :: Error > {
235243 if self . forbid_free_placeholders ( ) {
236244 panic ! ( "unexpected placeholder const `{:?}`" , universe)
237245 } else {
@@ -259,7 +267,7 @@ where
259267 var : InferenceVar ,
260268 kind : TyVariableKind ,
261269 outer_binder : DebruijnIndex ,
262- ) -> Fallible < Ty < I > > {
270+ ) -> Result < Ty < I > , Self :: Error > {
263271 if self . forbid_inference_vars ( ) {
264272 panic ! ( "unexpected inference type `{:?}`" , var)
265273 } else {
@@ -273,7 +281,7 @@ where
273281 & mut self ,
274282 var : InferenceVar ,
275283 outer_binder : DebruijnIndex ,
276- ) -> Fallible < Lifetime < I > > {
284+ ) -> Result < Lifetime < I > , Self :: Error > {
277285 if self . forbid_inference_vars ( ) {
278286 panic ! ( "unexpected inference lifetime `'{:?}`" , var)
279287 } else {
@@ -288,7 +296,7 @@ where
288296 ty : Ty < I > ,
289297 var : InferenceVar ,
290298 outer_binder : DebruijnIndex ,
291- ) -> Fallible < Const < I > > {
299+ ) -> Result < Const < I > , Self :: Error > {
292300 if self . forbid_inference_vars ( ) {
293301 panic ! ( "unexpected inference const `{:?}`" , var)
294302 } else {
@@ -318,11 +326,11 @@ pub trait Fold<I: Interner>: Debug {
318326 /// folder. Typically `binders` starts as 0, but is adjusted when
319327 /// we encounter `Binders<T>` in the IR or other similar
320328 /// constructs.
321- fn fold_with < ' i > (
329+ fn fold_with < ' i , E > (
322330 self ,
323- folder : & mut dyn Folder < ' i , I > ,
331+ folder : & mut dyn Folder < ' i , I , Error = E > ,
324332 outer_binder : DebruijnIndex ,
325- ) -> Fallible < Self :: Result >
333+ ) -> Result < Self :: Result , E >
326334 where
327335 I : ' i ;
328336}
@@ -332,11 +340,11 @@ pub trait Fold<I: Interner>: Debug {
332340/// the contents of the type.
333341pub trait SuperFold < I : Interner > : Fold < I > {
334342 /// Recursively folds the value.
335- fn super_fold_with < ' i > (
343+ fn super_fold_with < ' i , E > (
336344 self ,
337- folder : & mut dyn Folder < ' i , I > ,
345+ folder : & mut dyn Folder < ' i , I , Error = E > ,
338346 outer_binder : DebruijnIndex ,
339- ) -> Fallible < Self :: Result >
347+ ) -> Result < Self :: Result , E >
340348 where
341349 I : ' i ;
342350}
@@ -347,11 +355,11 @@ pub trait SuperFold<I: Interner>: Fold<I> {
347355impl < I : Interner > Fold < I > for Ty < I > {
348356 type Result = Ty < I > ;
349357
350- fn fold_with < ' i > (
358+ fn fold_with < ' i , E > (
351359 self ,
352- folder : & mut dyn Folder < ' i , I > ,
360+ folder : & mut dyn Folder < ' i , I , Error = E > ,
353361 outer_binder : DebruijnIndex ,
354- ) -> Fallible < Self :: Result >
362+ ) -> Result < Self :: Result , E >
355363 where
356364 I : ' i ,
357365 {
@@ -364,11 +372,11 @@ impl<I> SuperFold<I> for Ty<I>
364372where
365373 I : Interner ,
366374{
367- fn super_fold_with < ' i > (
375+ fn super_fold_with < ' i , E > (
368376 self ,
369- folder : & mut dyn Folder < ' i , I > ,
377+ folder : & mut dyn Folder < ' i , I , Error = E > ,
370378 outer_binder : DebruijnIndex ,
371- ) -> Fallible < Ty < I > >
379+ ) -> Result < Ty < I > , E >
372380 where
373381 I : ' i ,
374382 {
@@ -477,11 +485,11 @@ where
477485impl < I : Interner > Fold < I > for Lifetime < I > {
478486 type Result = Lifetime < I > ;
479487
480- fn fold_with < ' i > (
488+ fn fold_with < ' i , E > (
481489 self ,
482- folder : & mut dyn Folder < ' i , I > ,
490+ folder : & mut dyn Folder < ' i , I , Error = E > ,
483491 outer_binder : DebruijnIndex ,
484- ) -> Fallible < Self :: Result >
492+ ) -> Result < Self :: Result , E >
485493 where
486494 I : ' i ,
487495 {
@@ -493,11 +501,11 @@ impl<I> SuperFold<I> for Lifetime<I>
493501where
494502 I : Interner ,
495503{
496- fn super_fold_with < ' i > (
504+ fn super_fold_with < ' i , E > (
497505 self ,
498- folder : & mut dyn Folder < ' i , I > ,
506+ folder : & mut dyn Folder < ' i , I , Error = E > ,
499507 outer_binder : DebruijnIndex ,
500- ) -> Fallible < Lifetime < I > >
508+ ) -> Result < Lifetime < I > , E >
501509 where
502510 I : ' i ,
503511 {
@@ -535,11 +543,11 @@ where
535543impl < I : Interner > Fold < I > for Const < I > {
536544 type Result = Const < I > ;
537545
538- fn fold_with < ' i > (
546+ fn fold_with < ' i , E > (
539547 self ,
540- folder : & mut dyn Folder < ' i , I > ,
548+ folder : & mut dyn Folder < ' i , I , Error = E > ,
541549 outer_binder : DebruijnIndex ,
542- ) -> Fallible < Self :: Result >
550+ ) -> Result < Self :: Result , E >
543551 where
544552 I : ' i ,
545553 {
@@ -551,11 +559,11 @@ impl<I> SuperFold<I> for Const<I>
551559where
552560 I : Interner ,
553561{
554- fn super_fold_with < ' i > (
562+ fn super_fold_with < ' i , E > (
555563 self ,
556- folder : & mut dyn Folder < ' i , I > ,
564+ folder : & mut dyn Folder < ' i , I , Error = E > ,
557565 outer_binder : DebruijnIndex ,
558- ) -> Fallible < Const < I > >
566+ ) -> Result < Const < I > , E >
559567 where
560568 I : ' i ,
561569 {
@@ -592,11 +600,11 @@ where
592600impl < I : Interner > Fold < I > for Goal < I > {
593601 type Result = Goal < I > ;
594602
595- fn fold_with < ' i > (
603+ fn fold_with < ' i , E > (
596604 self ,
597- folder : & mut dyn Folder < ' i , I > ,
605+ folder : & mut dyn Folder < ' i , I , Error = E > ,
598606 outer_binder : DebruijnIndex ,
599- ) -> Fallible < Self :: Result >
607+ ) -> Result < Self :: Result , E >
600608 where
601609 I : ' i ,
602610 {
@@ -606,11 +614,11 @@ impl<I: Interner> Fold<I> for Goal<I> {
606614
607615/// Superfold folds recursively.
608616impl < I : Interner > SuperFold < I > for Goal < I > {
609- fn super_fold_with < ' i > (
617+ fn super_fold_with < ' i , E > (
610618 self ,
611- folder : & mut dyn Folder < ' i , I > ,
619+ folder : & mut dyn Folder < ' i , I , Error = E > ,
612620 outer_binder : DebruijnIndex ,
613- ) -> Fallible < Self :: Result >
621+ ) -> Result < Self :: Result , E >
614622 where
615623 I : ' i ,
616624 {
@@ -630,11 +638,11 @@ impl<I: Interner> SuperFold<I> for Goal<I> {
630638impl < I : Interner > Fold < I > for ProgramClause < I > {
631639 type Result = ProgramClause < I > ;
632640
633- fn fold_with < ' i > (
641+ fn fold_with < ' i , E > (
634642 self ,
635- folder : & mut dyn Folder < ' i , I > ,
643+ folder : & mut dyn Folder < ' i , I , Error = E > ,
636644 outer_binder : DebruijnIndex ,
637- ) -> Fallible < Self :: Result >
645+ ) -> Result < Self :: Result , E >
638646 where
639647 I : ' i ,
640648 {
0 commit comments