Skip to content

Commit ad46c01

Browse files
committed
aggregate_tys for impl trait
1 parent f1027a0 commit ad46c01

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

chalk-solve/src/solve/slg/aggregate.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,10 @@ impl<TF: TypeFamily> AntiUnifier<'_, TF> {
223223
TyData::Alias(AliasTy::Projection(proj2)),
224224
) => self.aggregate_projection_tys(proj1, proj2),
225225

226-
(TyData::Alias(_), TyData::Alias(_)) => todo!(),
226+
(
227+
TyData::Alias(AliasTy::ImplTrait(impl_trait1)),
228+
TyData::Alias(AliasTy::ImplTrait(impl_trait2)),
229+
) => self.aggregate_impl_trait_tys(impl_trait1, impl_trait2),
227230

228231
(TyData::Placeholder(placeholder1), TyData::Placeholder(placeholder2)) => {
229232
self.aggregate_placeholder_tys(placeholder1, placeholder2)
@@ -298,6 +301,31 @@ impl<TF: TypeFamily> AntiUnifier<'_, TF> {
298301
.unwrap_or_else(|| self.new_variable())
299302
}
300303

304+
fn aggregate_impl_trait_tys(
305+
&mut self,
306+
impl_trait1: &ImplTraitTy<TF>,
307+
impl_trait2: &ImplTraitTy<TF>,
308+
) -> Ty<TF> {
309+
let ImplTraitTy {
310+
impl_trait_id: name1,
311+
substitution: substitution1,
312+
} = impl_trait1;
313+
let ImplTraitTy {
314+
impl_trait_id: name2,
315+
substitution: substitution2,
316+
} = impl_trait2;
317+
318+
self.aggregate_name_and_substs(name1, substitution1, name2, substitution2)
319+
.map(|(&impl_trait_id, substitution)| {
320+
TyData::Alias(AliasTy::ImplTrait(ImplTraitTy {
321+
impl_trait_id,
322+
substitution,
323+
}))
324+
.intern()
325+
})
326+
.unwrap_or_else(|| self.new_variable())
327+
}
328+
301329
fn aggregate_name_and_substs<N>(
302330
&mut self,
303331
name1: N,

chalk-solve/src/wf.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ impl<TF: TypeFamily> FoldInputTypes for Ty<TF> {
9292
proj.substitution.fold(accumulator);
9393
}
9494

95-
TyData::Alias(_) => todo!(),
95+
TyData::Alias(AliasTy::ImplTrait(impl_trait)) => {
96+
accumulator.push(self.clone());
97+
impl_trait.substitution.fold(accumulator);
98+
}
9699

97100
TyData::Placeholder(_) => {
98101
accumulator.push(self.clone());

0 commit comments

Comments
 (0)