Rollup merge of #100338 - lyming2007:issue-100285-fix, r=petrochenkov
when there are 3 or more return statements in the loop emit the first 3 errors and duplicated diagnostic information modified: compiler/rustc_typeck/src/check/coercion.rs new file: src/test/ui/typeck/issue-100285.rs new file: src/test/ui/typeck/issue-100285.stderr
This commit is contained in:
commit
836f706d9a
3 changed files with 65 additions and 1 deletions
|
@ -1594,7 +1594,9 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
|
|||
let hir::ExprKind::Loop(_, _, _, loop_span) = expr.kind else { return;};
|
||||
let mut span: MultiSpan = vec![loop_span].into();
|
||||
span.push_span_label(loop_span, "this might have zero elements to iterate on");
|
||||
for ret_expr in ret_exprs {
|
||||
const MAXITER: usize = 3;
|
||||
let iter = ret_exprs.iter().take(MAXITER);
|
||||
for ret_expr in iter {
|
||||
span.push_span_label(
|
||||
ret_expr.span,
|
||||
"if the loop doesn't execute, this value would never get returned",
|
||||
|
@ -1604,6 +1606,12 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
|
|||
span,
|
||||
"the function expects a value to always be returned, but loops might run zero times",
|
||||
);
|
||||
if MAXITER < ret_exprs.len() {
|
||||
err.note(&format!(
|
||||
"if the loop doesn't execute, {} other values would never get returned",
|
||||
ret_exprs.len() - MAXITER
|
||||
));
|
||||
}
|
||||
err.help(
|
||||
"return a value for the case when the loop has zero elements to iterate on, or \
|
||||
consider changing the return type to account for that possibility",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue