Skip to content

Commit

Permalink
Eagerly instantiate opaque types
Browse files Browse the repository at this point in the history
  • Loading branch information
oli-obk committed Dec 16, 2021
1 parent 689a868 commit 5c46002
Showing 1 changed file with 4 additions and 6 deletions.
10 changes: 4 additions & 6 deletions compiler/rustc_infer/src/infer/opaque_types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -551,14 +551,16 @@ impl<'a, 'tcx> Instantiator<'a, 'tcx> {
let predicate = predicate.subst(tcx, substs);
debug!(?predicate);

// Replace all other mentions of the same opaque type with the hidden type,
// as the bounds must hold on the hidden type after all.
let predicate = predicate.fold_with(&mut BottomUpFolder {
tcx,
ty_op: |ty| match *ty.kind() {
// Replace all other mentions of the same opaque type with the hidden type,
// as the bounds must hold on the hidden type after all.
ty::Opaque(def_id2, substs2) if def_id == def_id2 && substs == substs2 => {
ty_var
}
// Instantiate nested instances of `impl Trait`.
ty::Opaque(..) => self.instantiate_opaque_types_in_map(ty),
_ => ty,
},
lt_op: |lt| lt,
Expand Down Expand Up @@ -589,10 +591,6 @@ impl<'a, 'tcx> Instantiator<'a, 'tcx> {
return tcx.ty_error();
}
}
// Change the predicate to refer to the type variable,
// which will be the concrete type instead of the opaque type.
// This also instantiates nested instances of `impl Trait`.
let predicate = self.instantiate_opaque_types_in_map(predicate);

let cause =
traits::ObligationCause::new(self.value_span, self.body_id, traits::OpaqueType);
Expand Down

0 comments on commit 5c46002

Please sign in to comment.