From c6a4f810d926d00a176de40ae78288c145f3843d Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Sat, 13 Apr 2024 07:26:47 +0000 Subject: [PATCH] Replace a `DefiningOpaqueTypes::No` with `Yes` by asserting that one side of the comparison is a type variable. Thus there will never be an opaque type involved in a way that constrains its hidden type, as the other side of the comparison is always a generator witness type --- compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs b/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs index da46ed07690..2580179ce5b 100644 --- a/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs +++ b/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs @@ -561,9 +561,13 @@ pub(in super::super) fn resolve_coroutine_interiors(&self) { // Unify `interior` with `witness` and collect all the resulting obligations. let span = self.tcx.hir().body(body_id).value.span; + let ty::Infer(ty::InferTy::TyVar(_)) = interior.kind() else { + span_bug!(span, "coroutine interior witness not infer: {:?}", interior.kind()) + }; let ok = self .at(&self.misc(span), self.param_env) - .eq(DefineOpaqueTypes::No, interior, witness) + // Will never define opaque types, as all we do is instantiate a type variable. + .eq(DefineOpaqueTypes::Yes, interior, witness) .expect("Failed to unify coroutine interior type"); let mut obligations = ok.obligations;