Skip to content

Commit

Permalink
allow escaping bound vars when normalizing ty::Opaque
Browse files Browse the repository at this point in the history
  • Loading branch information
lcnr committed Aug 12, 2020
1 parent c94ed5c commit d2398ee
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 9 deletions.
7 changes: 2 additions & 5 deletions src/librustc_trait_selection/traits/project.rs
Expand Up @@ -324,8 +324,7 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> {

let ty = ty.super_fold_with(self);
match ty.kind {
ty::Opaque(def_id, substs) if !substs.has_escaping_bound_vars() => {
// (*)
ty::Opaque(def_id, substs) => {
// Only normalize `impl Trait` after type-checking, usually in codegen.
match self.param_env.reveal() {
Reveal::UserFacing => ty,
Expand Down Expand Up @@ -353,9 +352,7 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> {
}

ty::Projection(ref data) if !data.has_escaping_bound_vars() => {
// (*)

// (*) This is kind of hacky -- we need to be able to
// This is kind of hacky -- we need to be able to
// handle normalization within binders because
// otherwise we wind up a need to normalize when doing
// trait matching (since you can have a trait
Expand Down
6 changes: 2 additions & 4 deletions src/librustc_trait_selection/traits/query/normalize.rs
Expand Up @@ -101,8 +101,7 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> {

let ty = ty.super_fold_with(self);
match ty.kind {
ty::Opaque(def_id, substs) if !substs.has_escaping_bound_vars() => {
// (*)
ty::Opaque(def_id, substs) => {
// Only normalize `impl Trait` after type-checking, usually in codegen.
match self.param_env.reveal() {
Reveal::UserFacing => ty,
Expand Down Expand Up @@ -140,8 +139,7 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> {
}

ty::Projection(ref data) if !data.has_escaping_bound_vars() => {
// (*)
// (*) This is kind of hacky -- we need to be able to
// This is kind of hacky -- we need to be able to
// handle normalization within binders because
// otherwise we wind up a need to normalize when doing
// trait matching (since you can have a trait
Expand Down
13 changes: 13 additions & 0 deletions src/test/ui/mir/issue-75419-validation-impl-trait.rs
@@ -0,0 +1,13 @@
// build-pass

// This used to fail MIR validation due to the types on both sides of
// an assignment not being equal.
// The failure doesn't occur with a check-only build.

fn iter_slice<'a, T>(xs: &'a [T]) -> impl Iterator<Item = &'a T> {
xs.iter()
}

fn main() {
iter_slice::<()> as fn(_) -> _;
}

0 comments on commit d2398ee

Please sign in to comment.