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(),
|
Fn => lang_items.fn_trait(),
|
||||||
FnMut => lang_items.fn_mut_trait(),
|
FnMut => lang_items.fn_mut_trait(),
|
||||||
FnOnce => lang_items.fn_once_trait(),
|
FnOnce => lang_items.fn_once_trait(),
|
||||||
|
Generator => lang_items.gen_trait(),
|
||||||
Unsize => lang_items.unsize_trait(),
|
Unsize => lang_items.unsize_trait(),
|
||||||
Unpin => lang_items.unpin_trait(),
|
Unpin => lang_items.unpin_trait(),
|
||||||
CoerceUnsized => lang_items.coerce_unsized_trait(),
|
CoerceUnsized => lang_items.coerce_unsized_trait(),
|
||||||
DiscriminantKind => lang_items.discriminant_kind_trait(),
|
DiscriminantKind => lang_items.discriminant_kind_trait(),
|
||||||
Generator => lang_items.generator_return(),
|
|
||||||
};
|
};
|
||||||
def_id.map(chalk_ir::TraitId)
|
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);
|
let variances = self.interner.tcx.variances_of(def_id.0);
|
||||||
chalk_ir::Variances::from_iter(
|
chalk_ir::Variances::from_iter(
|
||||||
self.interner,
|
self.interner,
|
||||||
variances.iter().map(|v| match v {
|
variances.iter().map(|v| v.lower_into(self.interner)),
|
||||||
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!(),
|
|
||||||
}),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn adt_variance(
|
fn adt_variance(
|
||||||
&self,
|
&self,
|
||||||
def_id: chalk_ir::AdtId<RustInterner<'tcx>>,
|
adt_id: chalk_ir::AdtId<RustInterner<'tcx>>,
|
||||||
) -> chalk_ir::Variances<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(
|
chalk_ir::Variances::from_iter(
|
||||||
self.interner,
|
self.interner,
|
||||||
variances.iter().map(|v| match v {
|
variances.iter().map(|v| v.lower_into(self.interner)),
|
||||||
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!(),
|
|
||||||
}),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,12 +188,18 @@ impl<'tcx> LowerInto<'tcx, chalk_ir::GoalData<RustInterner<'tcx>>> for ty::Predi
|
||||||
chalk_ir::DomainGoal::ObjectSafe(chalk_ir::TraitId(t)),
|
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
|
// FIXME(chalk): other predicates
|
||||||
//
|
//
|
||||||
// We can defer this, but ultimately we'll want to express
|
// We can defer this, but ultimately we'll want to express
|
||||||
// some of these in terms of chalk operations.
|
// some of these in terms of chalk operations.
|
||||||
ty::PredicateKind::ClosureKind(..)
|
ty::PredicateKind::ClosureKind(..)
|
||||||
| ty::PredicateKind::Subtype(..)
|
|
||||||
| ty::PredicateKind::Coerce(..)
|
| ty::PredicateKind::Coerce(..)
|
||||||
| ty::PredicateKind::ConstEvaluatable(..)
|
| ty::PredicateKind::ConstEvaluatable(..)
|
||||||
| ty::PredicateKind::ConstEquate(..) => {
|
| 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>>>
|
impl<'tcx> LowerInto<'tcx, chalk_solve::rust_ir::AliasEqBound<RustInterner<'tcx>>>
|
||||||
for ty::ProjectionPredicate<'tcx>
|
for ty::ProjectionPredicate<'tcx>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue