Check GAT, IAT, and weak type where clauses during projection

This commit is contained in:
Michael Goulet
2023-07-07 19:22:22 +00:00
parent 085ae9e8b4
commit c9ce51b5c7
6 changed files with 112 additions and 16 deletions

View File

@@ -21,12 +21,6 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
inherent.self_ty(),
tcx.type_of(impl_def_id).instantiate(tcx, impl_substs),
)?;
self.add_goals(
tcx.predicates_of(impl_def_id)
.instantiate(tcx, impl_substs)
.into_iter()
.map(|(pred, _)| goal.with(tcx, pred)),
);
// Equate IAT with the RHS of the project goal
let inherent_substs = inherent.rebase_inherent_args_onto_impl(impl_substs, tcx);
@@ -37,6 +31,14 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
)
.expect("expected goal term to be fully unconstrained");
// Check both where clauses on the impl and IAT
self.add_goals(
tcx.predicates_of(inherent.def_id)
.instantiate(tcx, inherent_substs)
.into_iter()
.map(|(pred, _)| goal.with(tcx, pred)),
);
self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes)
}
}

View File

@@ -112,6 +112,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> {
) -> QueryResult<'tcx> {
if let Some(projection_pred) = assumption.as_projection_clause() {
if projection_pred.projection_def_id() == goal.predicate.def_id() {
let tcx = ecx.tcx();
ecx.probe_candidate("assumption").enter(|ecx| {
let assumption_projection_pred =
ecx.instantiate_binder_with_infer(projection_pred);
@@ -122,6 +123,14 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> {
)?;
ecx.eq(goal.param_env, goal.predicate.term, assumption_projection_pred.term)
.expect("expected goal term to be fully unconstrained");
// Add GAT where clauses from the trait's definition
ecx.add_goals(
tcx.predicates_of(goal.predicate.def_id())
.instantiate_own(tcx, goal.predicate.projection_ty.args)
.map(|(pred, _)| goal.with(tcx, pred)),
);
then(ecx)
})
} else {
@@ -160,6 +169,13 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> {
.map(|pred| goal.with(tcx, pred));
ecx.add_goals(where_clause_bounds);
// Add GAT where clauses from the trait's definition
ecx.add_goals(
tcx.predicates_of(goal.predicate.def_id())
.instantiate_own(tcx, goal.predicate.projection_ty.args)
.map(|(pred, _)| goal.with(tcx, pred)),
);
// In case the associated item is hidden due to specialization, we have to
// return ambiguity this would otherwise be incomplete, resulting in
// unsoundness during coherence (#105782).

View File

@@ -14,6 +14,16 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
let actual = tcx.type_of(weak_ty.def_id).instantiate(tcx, weak_ty.args);
self.eq(goal.param_env, expected, actual)?;
// Check where clauses
self.add_goals(
tcx.predicates_of(weak_ty.def_id)
.instantiate(tcx, weak_ty.args)
.predicates
.into_iter()
.map(|pred| goal.with(tcx, pred)),
);
self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes)
}
}