Change inference var check to be in project_type
This commit is contained in:
@@ -2470,7 +2470,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||
let projection_ty = ty::ProjectionTy {
|
||||
// `T`
|
||||
substs: self.tcx.mk_substs_trait(
|
||||
trait_ref.self_ty().skip_binder(),
|
||||
trait_pred.self_ty().skip_binder(),
|
||||
&self.fresh_substs_for_item(span, item_def_id)[1..],
|
||||
),
|
||||
// `Future::Output`
|
||||
|
||||
@@ -1073,6 +1073,16 @@ fn project<'cx, 'tcx>(
|
||||
return Ok(Projected::Progress(Progress::error(selcx.tcx())));
|
||||
}
|
||||
|
||||
// If the obligation contains any inference types or consts in associated
|
||||
// type substs, then we don't assemble any candidates.
|
||||
// This isn't really correct, but otherwise we can end up in a case where
|
||||
// we constrain inference variables by selecting a single predicate, when
|
||||
// we need to stay general. See issue #91762.
|
||||
let (_, predicate_own_substs) = obligation.predicate.trait_ref_and_own_substs(selcx.tcx());
|
||||
if predicate_own_substs.iter().any(|g| g.has_infer_types_or_consts()) {
|
||||
return Err(ProjectionError::TooManyCandidates);
|
||||
}
|
||||
|
||||
let mut candidates = ProjectionCandidateSet::None;
|
||||
|
||||
// Make sure that the following procedures are kept in order. ParamEnv
|
||||
|
||||
@@ -1521,16 +1521,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
infer_predicate.projection_ty
|
||||
};
|
||||
|
||||
// If the obligation contains any inference types or consts in associated
|
||||
// type substs, then we don't match any projection candidates against it.
|
||||
// This isn't really correct, but otherwise we can end up in a case where
|
||||
// we constrain inference variables by selecting a single predicate, when
|
||||
// we need to stay general. See issue #91762.
|
||||
let (_, predicate_own_substs) =
|
||||
obligation.predicate.trait_ref_and_own_substs(self.infcx.tcx);
|
||||
if predicate_own_substs.iter().any(|g| g.has_infer_types_or_consts()) {
|
||||
return false;
|
||||
}
|
||||
self.infcx
|
||||
.at(&obligation.cause, obligation.param_env)
|
||||
.sup(obligation.predicate, infer_projection)
|
||||
|
||||
Reference in New Issue
Block a user