@@ -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