Skip to content

Commit cca3b87

Browse files
authored
Rollup merge of rust-lang#95908 - compiler-errors:shallow_resolve_ty-inline, r=oli-obk
Inline `shallow_resolve_ty` into `ShallowResolver` addresses fixme I found in infcx
2 parents f77c0db + edeb826 commit cca3b87

File tree

1 file changed

+39
-44
lines changed
  • compiler/rustc_infer/src/infer

1 file changed

+39
-44
lines changed

compiler/rustc_infer/src/infer/mod.rs

+39-44
Original file line numberDiff line numberDiff line change
@@ -1659,49 +1659,6 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
16591659
self.tcx.const_eval_resolve(param_env_erased, unevaluated, span)
16601660
}
16611661

1662-
/// If `typ` is a type variable of some kind, resolve it one level
1663-
/// (but do not resolve types found in the result). If `typ` is
1664-
/// not a type variable, just return it unmodified.
1665-
// FIXME(eddyb) inline into `ShallowResolver::visit_ty`.
1666-
fn shallow_resolve_ty(&self, typ: Ty<'tcx>) -> Ty<'tcx> {
1667-
match *typ.kind() {
1668-
ty::Infer(ty::TyVar(v)) => {
1669-
// Not entirely obvious: if `typ` is a type variable,
1670-
// it can be resolved to an int/float variable, which
1671-
// can then be recursively resolved, hence the
1672-
// recursion. Note though that we prevent type
1673-
// variables from unifying to other type variables
1674-
// directly (though they may be embedded
1675-
// structurally), and we prevent cycles in any case,
1676-
// so this recursion should always be of very limited
1677-
// depth.
1678-
//
1679-
// Note: if these two lines are combined into one we get
1680-
// dynamic borrow errors on `self.inner`.
1681-
let known = self.inner.borrow_mut().type_variables().probe(v).known();
1682-
known.map_or(typ, |t| self.shallow_resolve_ty(t))
1683-
}
1684-
1685-
ty::Infer(ty::IntVar(v)) => self
1686-
.inner
1687-
.borrow_mut()
1688-
.int_unification_table()
1689-
.probe_value(v)
1690-
.map(|v| v.to_type(self.tcx))
1691-
.unwrap_or(typ),
1692-
1693-
ty::Infer(ty::FloatVar(v)) => self
1694-
.inner
1695-
.borrow_mut()
1696-
.float_unification_table()
1697-
.probe_value(v)
1698-
.map(|v| v.to_type(self.tcx))
1699-
.unwrap_or(typ),
1700-
1701-
_ => typ,
1702-
}
1703-
}
1704-
17051662
/// `ty_or_const_infer_var_changed` is equivalent to one of these two:
17061663
/// * `shallow_resolve(ty) != ty` (where `ty.kind = ty::Infer(_)`)
17071664
/// * `shallow_resolve(ct) != ct` (where `ct.kind = ty::ConstKind::Infer(_)`)
@@ -1831,8 +1788,46 @@ impl<'a, 'tcx> TypeFolder<'tcx> for ShallowResolver<'a, 'tcx> {
18311788
self.infcx.tcx
18321789
}
18331790

1791+
/// If `ty` is a type variable of some kind, resolve it one level
1792+
/// (but do not resolve types found in the result). If `typ` is
1793+
/// not a type variable, just return it unmodified.
18341794
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
1835-
self.infcx.shallow_resolve_ty(ty)
1795+
match *ty.kind() {
1796+
ty::Infer(ty::TyVar(v)) => {
1797+
// Not entirely obvious: if `typ` is a type variable,
1798+
// it can be resolved to an int/float variable, which
1799+
// can then be recursively resolved, hence the
1800+
// recursion. Note though that we prevent type
1801+
// variables from unifying to other type variables
1802+
// directly (though they may be embedded
1803+
// structurally), and we prevent cycles in any case,
1804+
// so this recursion should always be of very limited
1805+
// depth.
1806+
//
1807+
// Note: if these two lines are combined into one we get
1808+
// dynamic borrow errors on `self.inner`.
1809+
let known = self.infcx.inner.borrow_mut().type_variables().probe(v).known();
1810+
known.map_or(ty, |t| self.fold_ty(t))
1811+
}
1812+
1813+
ty::Infer(ty::IntVar(v)) => self
1814+
.infcx
1815+
.inner
1816+
.borrow_mut()
1817+
.int_unification_table()
1818+
.probe_value(v)
1819+
.map_or(ty, |v| v.to_type(self.infcx.tcx)),
1820+
1821+
ty::Infer(ty::FloatVar(v)) => self
1822+
.infcx
1823+
.inner
1824+
.borrow_mut()
1825+
.float_unification_table()
1826+
.probe_value(v)
1827+
.map_or(ty, |v| v.to_type(self.infcx.tcx)),
1828+
1829+
_ => ty,
1830+
}
18361831
}
18371832

18381833
fn fold_const(&mut self, ct: ty::Const<'tcx>) -> ty::Const<'tcx> {

0 commit comments

Comments
 (0)