const_var: &'tcx ty::Const<'tcx>
) -> &'tcx ty::Const<'tcx> {
let infcx = self.infcx.expect("encountered const-var without infcx");
- let bound_to = infcx.resolve_const_var(const_var);
+ let bound_to = infcx.shallow_resolve(const_var);
if bound_to != const_var {
self.fold_const(bound_to)
} else {
}
}
- pub fn resolve_const_var(
- &self,
- ct: &'tcx ty::Const<'tcx>
- ) -> &'tcx ty::Const<'tcx> {
- if let ty::Const { val: ConstValue::Infer(InferConst::Var(v)), .. } = ct {
- self.const_unification_table
- .borrow_mut()
- .probe_value(*v)
- .val
- .known()
- .map(|c| self.resolve_const_var(c))
- .unwrap_or(ct)
- } else {
- ct
- }
- }
-
pub fn fully_resolve<T: TypeFoldable<'tcx>>(&self, value: &T) -> FixupResult<'tcx, T> {
/*!
* Attempts to resolve all type/region/const variables in
// it can be resolved to an int/float variable, which
// can then be recursively resolved, hence the
// recursion. Note though that we prevent type
- // variables from unifyxing to other type variables
+ // variables from unifying to other type variables
// directly (though they may be embedded
// structurally), and we prevent cycles in any case,
// so this recursion should always be of very limited
}
fn fold_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> {
- match ct {
- ty::Const { val: ConstValue::Infer(InferConst::Var(vid)), .. } => {
+ if let ty::Const { val: ConstValue::Infer(InferConst::Var(vid)), .. } = ct {
self.infcx.const_unification_table
.borrow_mut()
.probe_value(*vid)
.val
.known()
- .map(|c| self.fold_const(c))
.unwrap_or(ct)
- }
- _ => ct,
+ } else {
+ ct
}
}
}
ty: a.ty,
}))
}
- (ConstValue::ByRef { .. }, _) => {
- bug!(
- "non-Scalar ConstValue encountered in super_relate_consts {:?} {:?}",
- a,
- b,
- );
- }
+
+ // FIXME(const_generics): we should either handle `Scalar::Ptr` or add a comment
+ // saying that we're not handling it intentionally.
+
+ // FIXME(const_generics): handle `ConstValue::ByRef` and `ConstValue::Slice`.
// FIXME(const_generics): this is wrong, as it is a projection
(ConstValue::Unevaluated(a_def_id, a_substs),