diff options
| author | Andrew Cann <shum@canndrew.org> | 2022-03-18 14:24:54 +0800 |
|---|---|---|
| committer | Charles Lew <crlf0710@gmail.com> | 2022-09-11 14:04:16 +0800 |
| commit | c1f1bc6e8ff357bbff604d6db3d220bf29900179 (patch) | |
| tree | 10c08573fbc3be91e4a844532105ab68852dcc65 | |
| parent | a5cb3cca5ed28ccf865e7dbe74262e9744427bbe (diff) | |
| download | rust-c1f1bc6e8ff357bbff604d6db3d220bf29900179.tar.gz rust-c1f1bc6e8ff357bbff604d6db3d220bf29900179.zip | |
fix GeneratorWitness: Clone check
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/select/mod.rs | 23 |
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; } } } |
