]> git.lizzy.rs Git - rust.git/commitdiff
Fix ICE in `implicit_return`
authorJason Newcomb <jsnewcomb@pm.me>
Tue, 18 May 2021 14:51:59 +0000 (10:51 -0400)
committerJason Newcomb <jsnewcomb@pm.me>
Tue, 18 May 2021 14:51:59 +0000 (10:51 -0400)
async functions always return a value

clippy_lints/src/implicit_return.rs
tests/ui/crashes/ice-7231.rs [new file with mode: 0644]

index 30174fa2100dbbd2f259bbb7e8de3e9ac2ebed87..260a8f50157953076e286a66d4f3318a8cbd40a6 100644 (file)
@@ -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 (file)
index 0000000..5595d8d
--- /dev/null
@@ -0,0 +1,10 @@
+// edition:2018
+#![allow(clippy::never_loop)]
+
+async fn f() {
+    loop {
+        break;
+    }
+}
+
+fn main() {}