From 148e4f73dcc4bab82d0ad1689d2900e908133614 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Sat, 14 Jan 2023 04:46:23 +0000 Subject: [PATCH] new trait solver: only consider goal changed if response is not identity --- compiler/rustc_middle/src/infer/canonical.rs | 16 ++++++++++++++++ compiler/rustc_trait_selection/src/solve/mod.rs | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_middle/src/infer/canonical.rs b/compiler/rustc_middle/src/infer/canonical.rs index 614cf1a0051..7f3567c08be 100644 --- a/compiler/rustc_middle/src/infer/canonical.rs +++ b/compiler/rustc_middle/src/infer/canonical.rs @@ -68,6 +68,22 @@ pub struct CanonicalVarValues<'tcx> { pub var_values: IndexVec>, } +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 /// various parts of it with canonical variables. This struct stores /// those replaced bits to remember for when we process the query diff --git a/compiler/rustc_trait_selection/src/solve/mod.rs b/compiler/rustc_trait_selection/src/solve/mod.rs index 042ba96b379..80775b7aaf2 100644 --- a/compiler/rustc_trait_selection/src/solve/mod.rs +++ b/compiler/rustc_trait_selection/src/solve/mod.rs @@ -178,7 +178,7 @@ impl<'tcx> EvalCtxt<'tcx> { let canonical_goal = infcx.canonicalize_query(goal, &mut orig_values); let canonical_response = self.evaluate_canonical_goal(canonical_goal)?; 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), )) }