canonicalize const equate predicates
This commit is contained in:
parent
0035d9dcec
commit
696c88d69c
2 changed files with 16 additions and 9 deletions
|
@ -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![]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue