Rollup merge of #106834 - compiler-errors:new-solver-did-changed, r=lcnr
new trait solver: only consider goal changed if response is not identity I think this is the right way of implementing it.. r? `@lcnr`
This commit is contained in:
commit
fc9e2c1081
@ -68,6 +68,22 @@ pub struct CanonicalVarValues<'tcx> {
|
|||||||
pub var_values: IndexVec<BoundVar, GenericArg<'tcx>>,
|
pub var_values: IndexVec<BoundVar, GenericArg<'tcx>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl CanonicalVarValues<'_> {
|
||||||
|
pub fn is_identity(&self) -> bool {
|
||||||
|
self.var_values.iter_enumerated().all(|(bv, arg)| match arg.unpack() {
|
||||||
|
ty::GenericArgKind::Lifetime(r) => {
|
||||||
|
matches!(*r, ty::ReLateBound(ty::INNERMOST, br) if br.var == bv)
|
||||||
|
}
|
||||||
|
ty::GenericArgKind::Type(ty) => {
|
||||||
|
matches!(*ty.kind(), ty::Bound(ty::INNERMOST, bt) if bt.var == bv)
|
||||||
|
}
|
||||||
|
ty::GenericArgKind::Const(ct) => {
|
||||||
|
matches!(ct.kind(), ty::ConstKind::Bound(ty::INNERMOST, bc) if bc == bv)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// When we canonicalize a value to form a query, we wind up replacing
|
/// When we canonicalize a value to form a query, we wind up replacing
|
||||||
/// various parts of it with canonical variables. This struct stores
|
/// various parts of it with canonical variables. This struct stores
|
||||||
/// those replaced bits to remember for when we process the query
|
/// those replaced bits to remember for when we process the query
|
||||||
|
@ -178,7 +178,7 @@ impl<'tcx> EvalCtxt<'tcx> {
|
|||||||
let canonical_goal = infcx.canonicalize_query(goal, &mut orig_values);
|
let canonical_goal = infcx.canonicalize_query(goal, &mut orig_values);
|
||||||
let canonical_response = self.evaluate_canonical_goal(canonical_goal)?;
|
let canonical_response = self.evaluate_canonical_goal(canonical_goal)?;
|
||||||
Ok((
|
Ok((
|
||||||
true, // FIXME: check whether `var_values` are an identity substitution.
|
!canonical_response.value.var_values.is_identity(),
|
||||||
instantiate_canonical_query_response(infcx, &orig_values, canonical_response),
|
instantiate_canonical_query_response(infcx, &orig_values, canonical_response),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user