about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCentri3 <114838443+Centri3@users.noreply.github.com>2023-05-18 22:13:44 -0500
committerCentri3 <114838443+Centri3@users.noreply.github.com>2023-06-09 11:44:59 -0500
commit0c545c7bccdb45055f8874fa2700afb1ecb69f1d (patch)
treec759f1f5d598a1c317f3430433754e97097a372f
parent5825b9e3e29c98ca0b8ae74cc5ece8a05747a416 (diff)
downloadrust-0c545c7bccdb45055f8874fa2700afb1ecb69f1d.tar.gz
rust-0c545c7bccdb45055f8874fa2700afb1ecb69f1d.zip
also lint single expression blocks
Update mixed_read_write_in_expression.rs

Update diverging_sub_expression.stderr
-rw-r--r--clippy_lints/src/mixed_read_write_in_expression.rs8
-rw-r--r--tests/ui/diverging_sub_expression.rs9
-rw-r--r--tests/ui/diverging_sub_expression.stderr84
3 files changed, 100 insertions, 1 deletions
diff --git a/clippy_lints/src/mixed_read_write_in_expression.rs b/clippy_lints/src/mixed_read_write_in_expression.rs
index 942453498cd..caa3463b864 100644
--- a/clippy_lints/src/mixed_read_write_in_expression.rs
+++ b/clippy_lints/src/mixed_read_write_in_expression.rs
@@ -139,7 +139,13 @@ impl<'a, 'tcx> Visitor<'tcx> for DivergenceVisitor<'a, 'tcx> {
         match e.kind {
             // fix #10776
             ExprKind::Block(block, ..) => {
-                if let Some(stmt) = block.stmts.first() && block.stmts.len() == 1 {
+                if let Some(e) = block.expr {
+                    self.visit_expr(e);
+
+                    return;
+                }
+
+                if let [stmt] = block.stmts && block.stmts.len() == 1 {
                     match stmt.kind {
                         StmtKind::Expr(e) | StmtKind::Semi(e) => self.visit_expr(e),
                         _ => {},
diff --git a/tests/ui/diverging_sub_expression.rs b/tests/ui/diverging_sub_expression.rs
index 510eca21f71..3a4d66c5ba5 100644
--- a/tests/ui/diverging_sub_expression.rs
+++ b/tests/ui/diverging_sub_expression.rs
@@ -40,6 +40,15 @@ fn foobar() {
             // lint blocks as well
             15 => true || { return; },
             16 => false || { return; },
+            // ... and when it's a single expression
+            17 => true || { return },
+            18 => false || { return },
+            // ... but not when there's both an expression and a statement
+            19 => true || { _ = 1; return },
+            20 => false || { _ = 1; return },
+            // ... or multiple statements
+            21 => true || { _ = 1; return; },
+            22 => false || { _ = 1; return; },
             _ => true || break,
         };
     }
diff --git a/tests/ui/diverging_sub_expression.stderr b/tests/ui/diverging_sub_expression.stderr
index e69de29bb2d..e6396de2bb7 100644
--- a/tests/ui/diverging_sub_expression.stderr
+++ b/tests/ui/diverging_sub_expression.stderr
@@ -0,0 +1,84 @@
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:20:10
+   |
+LL |     b || diverge();
+   |          ^^^^^^^^^
+   |
+   = note: `-D clippy::diverging-sub-expression` implied by `-D warnings`
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:21:10
+   |
+LL |     b || A.foo();
+   |          ^^^^^^^
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:31:26
+   |
+LL |             6 => true || return,
+   |                          ^^^^^^
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:32:26
+   |
+LL |             7 => true || continue,
+   |                          ^^^^^^^^
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:35:26
+   |
+LL |             3 => true || diverge(),
+   |                          ^^^^^^^^^
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:38:30
+   |
+LL |                 _ => true || panic!("boo"),
+   |                              ^^^^^^^^^^^^^
+   |
+   = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:41:29
+   |
+LL |             15 => true || { return; },
+   |                             ^^^^^^
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:42:30
+   |
+LL |             16 => false || { return; },
+   |                              ^^^^^^
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:44:29
+   |
+LL |             17 => true || { return },
+   |                             ^^^^^^
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:45:30
+   |
+LL |             18 => false || { return },
+   |                              ^^^^^^
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:47:36
+   |
+LL |             19 => true || { _ = 1; return },
+   |                                    ^^^^^^
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:48:37
+   |
+LL |             20 => false || { _ = 1; return },
+   |                                     ^^^^^^
+
+error: sub-expression diverges
+  --> $DIR/diverging_sub_expression.rs:52:26
+   |
+LL |             _ => true || break,
+   |                          ^^^^^
+
+error: aborting due to 13 previous errors
+