Skip to content

Commit

Permalink
Fix ICE when yielding in fn returning impl Trait
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Dec 3, 2021
1 parent ff23ad3 commit 7c108ab
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 3 deletions.
26 changes: 23 additions & 3 deletions compiler/rustc_borrowck/src/type_check/input_output.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
7 changes: 7 additions & 0 deletions src/test/ui/generator/issue-91477.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#![feature(generators)]

fn foo() -> impl Sized {
yield 1; //~ ERROR E0627
}

fn main() {}
9 changes: 9 additions & 0 deletions src/test/ui/generator/issue-91477.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0627]: yield expression outside of generator literal
--> $DIR/issue-91477.rs:4:5
|
LL | yield 1;
| ^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0627`.

0 comments on commit 7c108ab

Please sign in to comment.