]> git.lizzy.rs Git - rust.git/commitdiff
Eagerly instantiate opaque types
authorOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>
Thu, 16 Dec 2021 15:26:01 +0000 (15:26 +0000)
committerOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>
Thu, 16 Dec 2021 15:26:01 +0000 (15:26 +0000)
compiler/rustc_infer/src/infer/opaque_types.rs

index eab5e5a5fb4e933dbd1dd585a9e965a2280fa34c..d5e65705b2885a9f2226ec032ae21bab8fd98dbf 100644 (file)
@@ -551,14 +551,16 @@ fn fold_opaque_ty(
             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,
@@ -589,10 +591,6 @@ fn fold_opaque_ty(
                     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);