diff options
| author | Jason Newcomb <jsnewcomb@pm.me> | 2021-05-18 10:51:59 -0400 |
|---|---|---|
| committer | Jason Newcomb <jsnewcomb@pm.me> | 2021-05-18 10:51:59 -0400 |
| commit | a149ba26fa07b42b40f6e38f69ef74ecd756d68f (patch) | |
| tree | ea95af615e2413310c7e428a846bcc5c341d163c | |
| parent | 98cddc5d3a5839a694f99aba2acf1c4dd28672f6 (diff) | |
| download | rust-a149ba26fa07b42b40f6e38f69ef74ecd756d68f.tar.gz rust-a149ba26fa07b42b40f6e38f69ef74ecd756d68f.zip | |
Fix ICE in `implicit_return`
async functions always return a value
| -rw-r--r-- | clippy_lints/src/implicit_return.rs | 6 | ||||
| -rw-r--r-- | tests/ui/crashes/ice-7231.rs | 10 |
2 files changed, 15 insertions, 1 deletions
diff --git a/clippy_lints/src/implicit_return.rs b/clippy_lints/src/implicit_return.rs index 30174fa2100..260a8f50157 100644 --- a/clippy_lints/src/implicit_return.rs +++ b/clippy_lints/src/implicit_return.rs @@ -147,7 +147,11 @@ fn lint_implicit_returns( visit_break_exprs(block, |break_expr, dest, sub_expr| { if dest.target_id.ok() == Some(expr.hir_id) { if call_site_span.is_none() && break_expr.span.ctxt() == ctxt { - lint_break(cx, break_expr.span, sub_expr.unwrap().span); + // At this point sub_expr can be `None` in async functions which either diverge, or return the + // unit type. + if let Some(sub_expr) = sub_expr { + lint_break(cx, break_expr.span, sub_expr.span); + } } else { // the break expression is from a macro call, add a return to the loop add_return = true; diff --git a/tests/ui/crashes/ice-7231.rs b/tests/ui/crashes/ice-7231.rs new file mode 100644 index 00000000000..5595d8d1d62 --- /dev/null +++ b/tests/ui/crashes/ice-7231.rs @@ -0,0 +1,10 @@ +// edition:2018 +#![allow(clippy::never_loop)] + +async fn f() { + loop { + break; + } +} + +fn main() {} |
