handle assoc consts in fulfill ConstEquate
This commit is contained in:
parent
d75cd5c051
commit
0ae3c5c609
8 changed files with 90 additions and 176 deletions
|
@ -457,41 +457,45 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
tcx.features().generic_const_exprs,
|
||||
"`ConstEquate` without a feature gate: {c1:?} {c2:?}",
|
||||
);
|
||||
debug!(?c1, ?c2, "equating consts");
|
||||
// FIXME: we probably should only try to unify abstract constants
|
||||
// if the constants depend on generic parameters.
|
||||
//
|
||||
// Let's just see where this breaks :shrug:
|
||||
match (c1.kind(), c2.kind()) {
|
||||
(ty::ConstKind::Unevaluated(a), ty::ConstKind::Unevaluated(b)) => {
|
||||
// FIXME: remove
|
||||
use rustc_hir::def::DefKind;
|
||||
if tcx.def_kind(a.def.did) == DefKind::AssocConst
|
||||
|| tcx.def_kind(b.def.did) == DefKind::AssocConst
|
||||
{
|
||||
// Two different constants using generic parameters ~> error.
|
||||
let expected_found = ExpectedFound::new(true, c1, c2);
|
||||
return ProcessResult::Error(
|
||||
FulfillmentErrorCode::CodeConstEquateError(
|
||||
expected_found,
|
||||
TypeError::ConstMismatch(expected_found),
|
||||
),
|
||||
);
|
||||
}
|
||||
{
|
||||
let c1 =
|
||||
if let Ok(Some(a)) = tcx.expand_abstract_consts(c1) { a } else { c1 };
|
||||
let c2 =
|
||||
if let Ok(Some(b)) = tcx.expand_abstract_consts(c2) { b } else { c2 };
|
||||
debug!("equating consts:\nc1= {:?}\nc2= {:?}", c1, c2);
|
||||
|
||||
if let Ok(Some(a)) = tcx.expand_abstract_consts(c1)
|
||||
&& let Ok(Some(b)) = tcx.expand_abstract_consts(c2)
|
||||
&& a.ty() == b.ty()
|
||||
&& let Ok(new_obligations) = infcx
|
||||
use rustc_hir::def::DefKind;
|
||||
use ty::ConstKind::Unevaluated;
|
||||
match (c1.kind(), c2.kind()) {
|
||||
(Unevaluated(a), Unevaluated(b))
|
||||
if a.def.did == b.def.did
|
||||
&& tcx.def_kind(a.def.did) == DefKind::AssocConst =>
|
||||
{
|
||||
if let Ok(new_obligations) = infcx
|
||||
.at(&obligation.cause, obligation.param_env)
|
||||
.eq(a, b)
|
||||
.trace(c1, c2)
|
||||
.eq(a.substs, b.substs)
|
||||
{
|
||||
return ProcessResult::Changed(mk_pending(
|
||||
new_obligations.into_obligations(),
|
||||
));
|
||||
}
|
||||
}
|
||||
(_, Unevaluated(_)) | (Unevaluated(_), _) => (),
|
||||
(_, _) => {
|
||||
if let Ok(new_obligations) =
|
||||
infcx.at(&obligation.cause, obligation.param_env).eq(c1, c2)
|
||||
{
|
||||
return ProcessResult::Changed(mk_pending(
|
||||
new_obligations.into_obligations(),
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
let stalled_on = &mut pending_obligation.stalled_on;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue