Skip to content

Commit b2e73e9

Browse files
committed
Auto merge of rust-lang#118261 - spastorino:fix-placeholder-replacer, r=compiler-errors
Make PlaceholderReplacer shallow_resolver and recur when infer vars This makes resolve type and const infer vars resolve. Given: ```rust #![feature(inherent_associated_types)] #![allow(incomplete_features)] struct Foo<T>(T); impl<'a> Foo<fn(&'a ())> { type Assoc = &'a (); } fn bar(_: for<'a> fn(Foo<fn(Foo<fn(&'static ())>::Assoc)>::Assoc)) {} fn main() {} ``` We should normalize `for<'a> fn(Foo<fn(Foo<fn(&'static ())>::Assoc)>::Assoc)` to `for<'0> fn(&'1 ())` with `'1 == '0` and `'0 == 'static` constraints. We have to resolve `'1` to `'static` in the infcx associated to `PlaceholderReplacer`. This is part of rust-lang#118118 but unrelated to that PR. r? `@compiler-errors` `@lcnr`
2 parents 34c5ab9 + f57e184 commit b2e73e9

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)