Fix more chalk lowering issues
- Implement lowering for subtype goals - Use correct lang item for Generator trait - Use `lower_into` for lowering `ty::Variance`
This commit is contained in:
parent
cb3cff3761
commit
d4fa173ed3
2 changed files with 22 additions and 16 deletions
|
@ -546,11 +546,11 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
|
|||
Fn => lang_items.fn_trait(),
|
||||
FnMut => lang_items.fn_mut_trait(),
|
||||
FnOnce => lang_items.fn_once_trait(),
|
||||
Generator => lang_items.gen_trait(),
|
||||
Unsize => lang_items.unsize_trait(),
|
||||
Unpin => lang_items.unpin_trait(),
|
||||
CoerceUnsized => lang_items.coerce_unsized_trait(),
|
||||
DiscriminantKind => lang_items.discriminant_kind_trait(),
|
||||
Generator => lang_items.generator_return(),
|
||||
};
|
||||
def_id.map(chalk_ir::TraitId)
|
||||
}
|
||||
|
@ -674,28 +674,18 @@ impl<'tcx> chalk_ir::UnificationDatabase<RustInterner<'tcx>> for RustIrDatabase<
|
|||
let variances = self.interner.tcx.variances_of(def_id.0);
|
||||
chalk_ir::Variances::from_iter(
|
||||
self.interner,
|
||||
variances.iter().map(|v| match v {
|
||||
ty::Variance::Invariant => chalk_ir::Variance::Invariant,
|
||||
ty::Variance::Covariant => chalk_ir::Variance::Covariant,
|
||||
ty::Variance::Contravariant => chalk_ir::Variance::Contravariant,
|
||||
ty::Variance::Bivariant => unimplemented!(),
|
||||
}),
|
||||
variances.iter().map(|v| v.lower_into(self.interner)),
|
||||
)
|
||||
}
|
||||
|
||||
fn adt_variance(
|
||||
&self,
|
||||
def_id: chalk_ir::AdtId<RustInterner<'tcx>>,
|
||||
adt_id: chalk_ir::AdtId<RustInterner<'tcx>>,
|
||||
) -> chalk_ir::Variances<RustInterner<'tcx>> {
|
||||
let variances = self.interner.tcx.variances_of(def_id.0.did);
|
||||
let variances = self.interner.tcx.variances_of(adt_id.0.did);
|
||||
chalk_ir::Variances::from_iter(
|
||||
self.interner,
|
||||
variances.iter().map(|v| match v {
|
||||
ty::Variance::Invariant => chalk_ir::Variance::Invariant,
|
||||
ty::Variance::Covariant => chalk_ir::Variance::Covariant,
|
||||
ty::Variance::Contravariant => chalk_ir::Variance::Contravariant,
|
||||
ty::Variance::Bivariant => unimplemented!(),
|
||||
}),
|
||||
variances.iter().map(|v| v.lower_into(self.interner)),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -188,12 +188,18 @@ impl<'tcx> LowerInto<'tcx, chalk_ir::GoalData<RustInterner<'tcx>>> for ty::Predi
|
|||
chalk_ir::DomainGoal::ObjectSafe(chalk_ir::TraitId(t)),
|
||||
),
|
||||
|
||||
ty::PredicateKind::Subtype(ty::SubtypePredicate { a, b, a_is_expected: _ }) => {
|
||||
chalk_ir::GoalData::SubtypeGoal(chalk_ir::SubtypeGoal {
|
||||
a: a.lower_into(interner),
|
||||
b: b.lower_into(interner),
|
||||
})
|
||||
}
|
||||
|
||||
// FIXME(chalk): other predicates
|
||||
//
|
||||
// We can defer this, but ultimately we'll want to express
|
||||
// some of these in terms of chalk operations.
|
||||
ty::PredicateKind::ClosureKind(..)
|
||||
| ty::PredicateKind::Subtype(..)
|
||||
| ty::PredicateKind::Coerce(..)
|
||||
| ty::PredicateKind::ConstEvaluatable(..)
|
||||
| ty::PredicateKind::ConstEquate(..) => {
|
||||
|
@ -790,6 +796,16 @@ impl<'tcx> LowerInto<'tcx, chalk_solve::rust_ir::Polarity> for ty::ImplPolarity
|
|||
}
|
||||
}
|
||||
}
|
||||
impl<'tcx> LowerInto<'tcx, chalk_ir::Variance> for ty::Variance {
|
||||
fn lower_into(self, _interner: RustInterner<'tcx>) -> chalk_ir::Variance {
|
||||
match self {
|
||||
ty::Variance::Covariant => chalk_ir::Variance::Covariant,
|
||||
ty::Variance::Invariant => chalk_ir::Variance::Invariant,
|
||||
ty::Variance::Contravariant => chalk_ir::Variance::Contravariant,
|
||||
ty::Variance::Bivariant => unimplemented!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> LowerInto<'tcx, chalk_solve::rust_ir::AliasEqBound<RustInterner<'tcx>>>
|
||||
for ty::ProjectionPredicate<'tcx>
|
||||
|
|
Loading…
Add table
Reference in a new issue