Skip to content

Commit

Permalink
Collapse placeholders to root universe in canonicalizer if not preser…
Browse files Browse the repository at this point in the history
…ving universes
  • Loading branch information
compiler-errors committed Feb 18, 2023
1 parent f4a4a31 commit ec40b1a
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 6 deletions.
13 changes: 9 additions & 4 deletions compiler/rustc_infer/src/infer/canonical/canonicalizer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -418,10 +418,15 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
bug!("encountered a fresh type during canonicalization")
}

ty::Placeholder(placeholder) => self.canonicalize_ty_var(
CanonicalVarInfo { kind: CanonicalVarKind::PlaceholderTy(placeholder) },
t,
),
ty::Placeholder(mut placeholder) => {
if !self.canonicalize_mode.preserve_universes() {
placeholder.universe = ty::UniverseIndex::ROOT;
}
self.canonicalize_ty_var(
CanonicalVarInfo { kind: CanonicalVarKind::PlaceholderTy(placeholder) },
t,
)
}

ty::Bound(debruijn, _) => {
if debruijn >= self.binder_index {
Expand Down
8 changes: 8 additions & 0 deletions tests/ui/traits/non_lifetime_binders/bad-sized-cond.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,15 @@ where
{
}

pub fn bar()
where
for<V> V: IntoIterator,
{
}

fn main() {
foo();
//~^ ERROR the size for values of type `V` cannot be known at compilation time

bar();
}
38 changes: 36 additions & 2 deletions tests/ui/traits/non_lifetime_binders/bad-sized-cond.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ LL | #![feature(non_lifetime_binders)]
= note: `#[warn(incomplete_features)]` on by default

error[E0277]: the size for values of type `V` cannot be known at compilation time
--> $DIR/bad-sized-cond.rs:11:5
--> $DIR/bad-sized-cond.rs:17:5
|
LL | foo();
| ^^^ doesn't have a size known at compile-time
Expand All @@ -23,6 +23,40 @@ LL | where
LL | for<V> V: Sized,
| ^^^^^ required by this bound in `foo`

error: aborting due to previous error; 1 warning emitted
error[E0277]: the size for values of type `Placeholder(Placeholder { universe: U3, name: Param(DefId(0:6 ~ bad_sized_cond[9450]::bar::V), "V") })` cannot be known at compilation time
--> $DIR/bad-sized-cond.rs:20:5
|
LL | bar();
| ^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `Placeholder(Placeholder { universe: U3, name: Param(DefId(0:6 ~ bad_sized_cond[9450]::bar::V), "V") })`
= note: required for `V` to implement `IntoIterator`
note: required by a bound in `bar`
--> $DIR/bad-sized-cond.rs:12:15
|
LL | pub fn bar()
| --- required by a bound in this
LL | where
LL | for<V> V: IntoIterator,
| ^^^^^^^^^^^^ required by this bound in `bar`

error[E0277]: `Placeholder(Placeholder { universe: U3, name: Param(DefId(0:6 ~ bad_sized_cond[9450]::bar::V), "V") })` is not an iterator
--> $DIR/bad-sized-cond.rs:20:5
|
LL | bar();
| ^^^ `Placeholder(Placeholder { universe: U3, name: Param(DefId(0:6 ~ bad_sized_cond[9450]::bar::V), "V") })` is not an iterator
|
= help: the trait `Iterator` is not implemented for `Placeholder(Placeholder { universe: U3, name: Param(DefId(0:6 ~ bad_sized_cond[9450]::bar::V), "V") })`
= note: required for `V` to implement `IntoIterator`
note: required by a bound in `bar`
--> $DIR/bad-sized-cond.rs:12:15
|
LL | pub fn bar()
| --- required by a bound in this
LL | where
LL | for<V> V: IntoIterator,
| ^^^^^^^^^^^^ required by this bound in `bar`

error: aborting due to 3 previous errors; 1 warning emitted

For more information about this error, try `rustc --explain E0277`.

0 comments on commit ec40b1a

Please sign in to comment.