1
Fork 0

Rollup merge of #120057 - oli-obk:not_sure_wtf_is_going_on, r=compiler-errors

Don't ICE when deducing future output if other errors already occurred

The situation can't really happen outside of erroneous code. What was interesting is that it ICEd before emitting any other diagnostics. This was because the other errors were silenced due to cycle_delay_bug cycle errors.

r? ```@compiler-errors```

fixes #119890
This commit is contained in:
Matthias Krüger 2024-01-18 10:34:20 +01:00 committed by GitHub
commit 34362b826d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 82 additions and 4 deletions

View file

@ -754,16 +754,22 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
get_future_output(obligation.predicate, obligation.cause.span)
})?
}
ty::Alias(ty::Projection, _) => {
return Some(Ty::new_error_with_message(
self.tcx,
closure_span,
"this projection should have been projected to an opaque type",
));
}
ty::Alias(ty::Opaque, ty::AliasTy { def_id, args, .. }) => self
.tcx
.explicit_item_bounds(def_id)
.iter_instantiated_copied(self.tcx, args)
.find_map(|(p, s)| get_future_output(p.as_predicate(), s))?,
ty::Error(_) => return Some(ret_ty),
_ => span_bug!(
closure_span,
"async fn coroutine return type not an inference variable: {ret_ty}"
),
_ => {
span_bug!(closure_span, "invalid async fn coroutine return type: {ret_ty:?}")
}
};
let output_ty = self.normalize(closure_span, output_ty);