diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2021-12-04 02:26:26 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-04 02:26:26 +0100 |
| commit | df51bffe6bef0c15f6e29a15ea54f269b251e179 (patch) | |
| tree | 128ff8192e7f692523f39d3034d79111ea891e6f /compiler | |
| parent | af546dba3165b6cf7bb7c521fe27baa49acc13fa (diff) | |
| parent | 7c108ababc7a54bd090f85aa7daab606af8ac6e8 (diff) | |
| download | rust-df51bffe6bef0c15f6e29a15ea54f269b251e179.tar.gz rust-df51bffe6bef0c15f6e29a15ea54f269b251e179.zip | |
Rollup merge of #91488 - compiler-errors:issue-91477, r=estebank
Fix ICE when `yield`ing in function returning `impl Trait` Change an assert to a `delay_span_bug` and remove an unwrap, that should fix it. Fixes #91477
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_borrowck/src/type_check/input_output.rs | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/compiler/rustc_borrowck/src/type_check/input_output.rs b/compiler/rustc_borrowck/src/type_check/input_output.rs index 92d2d04f23f..bc740de5150 100644 --- a/compiler/rustc_borrowck/src/type_check/input_output.rs +++ b/compiler/rustc_borrowck/src/type_check/input_output.rs @@ -117,9 +117,29 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } } - assert!(body.yield_ty().is_some() == universal_regions.yield_ty.is_some()); - if let Some(mir_yield_ty) = body.yield_ty() { - let ur_yield_ty = universal_regions.yield_ty.unwrap(); + debug!( + "equate_inputs_and_outputs: body.yield_ty {:?}, universal_regions.yield_ty {:?}", + body.yield_ty(), + universal_regions.yield_ty + ); + + // We will not have a universal_regions.yield_ty if we yield (by accident) + // outside of a generator and return an `impl Trait`, so emit a delay_span_bug + // because we don't want to panic in an assert here if we've already got errors. + if body.yield_ty().is_some() != universal_regions.yield_ty.is_some() { + self.tcx().sess.delay_span_bug( + body.span, + &format!( + "Expected body to have yield_ty ({:?}) iff we have a UR yield_ty ({:?})", + body.yield_ty(), + universal_regions.yield_ty, + ), + ); + } + + if let (Some(mir_yield_ty), Some(ur_yield_ty)) = + (body.yield_ty(), universal_regions.yield_ty) + { let yield_span = body.local_decls[RETURN_PLACE].source_info.span; self.equate_normalized_input_or_output(ur_yield_ty, mir_yield_ty, yield_span); } |
