canonicalize const equate predicates

This commit is contained in:
Ellen 2021-08-19 19:46:35 +01:00
parent 0035d9dcec
commit 696c88d69c
2 changed files with 16 additions and 9 deletions

View file

@ -4,6 +4,7 @@ use rustc_data_structures::obligation_forest::{Error, ForestObligation, Outcome}
use rustc_data_structures::obligation_forest::{ObligationForest, ObligationProcessor}; use rustc_data_structures::obligation_forest::{ObligationForest, ObligationProcessor};
use rustc_errors::ErrorReported; use rustc_errors::ErrorReported;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_infer::infer::canonical::OriginalQueryValues;
use rustc_infer::traits::{SelectionError, TraitEngine, TraitEngineExt as _, TraitObligation}; use rustc_infer::traits::{SelectionError, TraitEngine, TraitEngineExt as _, TraitObligation};
use rustc_middle::mir::abstract_const::NotConstEvaluatable; use rustc_middle::mir::abstract_const::NotConstEvaluatable;
use rustc_middle::mir::interpret::ErrorHandled; use rustc_middle::mir::interpret::ErrorHandled;
@ -552,11 +553,13 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> {
if let (ty::ConstKind::Unevaluated(a), ty::ConstKind::Unevaluated(b)) = if let (ty::ConstKind::Unevaluated(a), ty::ConstKind::Unevaluated(b)) =
(c1.val, c2.val) (c1.val, c2.val)
{ {
if self let canonical = infcx.canonicalize_query(
.selcx ((a.def, a.substs), (b.def, b.substs)),
.tcx() &mut OriginalQueryValues::default(),
.try_unify_abstract_consts(((a.def, a.substs), (b.def, b.substs))) );
{ debug!("canonical consts: {:?}", &canonical.value);
if self.selcx.tcx().try_unify_abstract_consts(canonical.value) {
return ProcessResult::Changed(vec![]); return ProcessResult::Changed(vec![]);
} }
} }

View file

@ -33,6 +33,7 @@ use rustc_errors::ErrorReported;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_hir::Constness; use rustc_hir::Constness;
use rustc_infer::infer::canonical::OriginalQueryValues;
use rustc_infer::infer::LateBoundRegionConversionTime; use rustc_infer::infer::LateBoundRegionConversionTime;
use rustc_middle::dep_graph::{DepKind, DepNodeIndex}; use rustc_middle::dep_graph::{DepKind, DepNodeIndex};
use rustc_middle::mir::abstract_const::NotConstEvaluatable; use rustc_middle::mir::abstract_const::NotConstEvaluatable;
@ -608,10 +609,13 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
if let (ty::ConstKind::Unevaluated(a), ty::ConstKind::Unevaluated(b)) = if let (ty::ConstKind::Unevaluated(a), ty::ConstKind::Unevaluated(b)) =
(c1.val, c2.val) (c1.val, c2.val)
{ {
if self let canonical = self.infcx.canonicalize_query(
.tcx() ((a.def, a.substs), (b.def, b.substs)),
.try_unify_abstract_consts(((a.def, a.substs), (b.def, b.substs))) &mut OriginalQueryValues::default(),
{ );
debug!("canonical consts: {:?}", &canonical.value);
if self.tcx().try_unify_abstract_consts(canonical.value) {
return Ok(EvaluatedToOk); return Ok(EvaluatedToOk);
} }
} }