about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndrew Cann <shum@canndrew.org>2022-03-18 14:24:54 +0800
committerCharles Lew <crlf0710@gmail.com>2022-09-11 14:04:16 +0800
commitc1f1bc6e8ff357bbff604d6db3d220bf29900179 (patch)
tree10c08573fbc3be91e4a844532105ab68852dcc65
parenta5cb3cca5ed28ccf865e7dbe74262e9744427bbe (diff)
downloadrust-c1f1bc6e8ff357bbff604d6db3d220bf29900179.tar.gz
rust-c1f1bc6e8ff357bbff604d6db3d220bf29900179.zip
fix GeneratorWitness: Clone check
-rw-r--r--compiler/rustc_trait_selection/src/traits/select/mod.rs23
1 files changed, 14 insertions, 9 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/select/mod.rs b/compiler/rustc_trait_selection/src/traits/select/mod.rs
index 5f9f9847b23..3499c64a1db 100644
--- a/compiler/rustc_trait_selection/src/traits/select/mod.rs
+++ b/compiler/rustc_trait_selection/src/traits/select/mod.rs
@@ -1958,18 +1958,23 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
             }
 
             ty::GeneratorWitness(binder) => {
-                let tys = self.tcx().erase_late_bound_regions(binder);
-                let mut iter = tys.iter();
+                let witness_tys = binder.skip_binder();
+                let mut iter = witness_tys.iter();
                 loop {
-                    let ty = match iter.next() {
-                        Some(ty) => ty,
+                    match iter.next() {
+                        Some(witness_ty) => {
+                            let resolved = self.infcx.shallow_resolve(witness_ty);
+                            if matches!(resolved.kind(), ty::Infer(ty::TyVar(_))) {
+                                break Ambiguous;
+                            }
+                        },
                         Option::None => {
-                            break Where(obligation.predicate.rebind(tys.to_vec()))
+                            // (*) binder moved here
+                            let all_vars = self.tcx().mk_bound_variable_kinds(
+                                obligation.predicate.bound_vars().iter().chain(binder.bound_vars().iter())
+                            );
+                            break Where(ty::Binder::bind_with_vars(witness_tys.to_vec(), all_vars));
                         },
-                    };
-                    let resolved = self.infcx.shallow_resolve(ty);
-                    if matches!(resolved.kind(), ty::Infer(ty::TyVar(_))) {
-                        break Ambiguous;
                     }
                 }
             }