Skip to content

Commit f57e184

Browse files
committed
Make PlaceholderReplacer shallow_resolver when folding const and ty and recur if contain infer vars
1 parent f74f700 commit f57e184

File tree

1 file changed

+18
-4
lines changed
  • compiler/rustc_trait_selection/src/traits

1 file changed

+18
-4
lines changed

compiler/rustc_trait_selection/src/traits/project.rs

+18-4
Original file line numberDiff line numberDiff line change
@@ -1001,7 +1001,7 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for PlaceholderReplacer<'_, 'tcx> {
10011001
&mut self,
10021002
t: ty::Binder<'tcx, T>,
10031003
) -> ty::Binder<'tcx, T> {
1004-
if !t.has_placeholders() && !t.has_infer_regions() {
1004+
if !t.has_placeholders() && !t.has_infer() {
10051005
return t;
10061006
}
10071007
self.current_index.shift_in(1);
@@ -1048,6 +1048,7 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for PlaceholderReplacer<'_, 'tcx> {
10481048
}
10491049

10501050
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
1051+
let ty = self.infcx.shallow_resolve(ty);
10511052
match *ty.kind() {
10521053
ty::Placeholder(p) => {
10531054
let replace_var = self.mapped_types.get(&p);
@@ -1063,16 +1064,23 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for PlaceholderReplacer<'_, 'tcx> {
10631064
);
10641065
Ty::new_bound(self.infcx.tcx, db, *replace_var)
10651066
}
1066-
None => ty,
1067+
None => {
1068+
if ty.has_infer() {
1069+
ty.super_fold_with(self)
1070+
} else {
1071+
ty
1072+
}
1073+
}
10671074
}
10681075
}
10691076

1070-
_ if ty.has_placeholders() || ty.has_infer_regions() => ty.super_fold_with(self),
1077+
_ if ty.has_placeholders() || ty.has_infer() => ty.super_fold_with(self),
10711078
_ => ty,
10721079
}
10731080
}
10741081

10751082
fn fold_const(&mut self, ct: ty::Const<'tcx>) -> ty::Const<'tcx> {
1083+
let ct = self.infcx.shallow_resolve(ct);
10761084
if let ty::ConstKind::Placeholder(p) = ct.kind() {
10771085
let replace_var = self.mapped_consts.get(&p);
10781086
match replace_var {
@@ -1087,7 +1095,13 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for PlaceholderReplacer<'_, 'tcx> {
10871095
);
10881096
ty::Const::new_bound(self.infcx.tcx, db, *replace_var, ct.ty())
10891097
}
1090-
None => ct,
1098+
None => {
1099+
if ct.has_infer() {
1100+
ct.super_fold_with(self)
1101+
} else {
1102+
ct
1103+
}
1104+
}
10911105
}
10921106
} else {
10931107
ct.super_fold_with(self)

0 commit comments

Comments
 (0)