]> git.lizzy.rs Git - rust.git/commitdiff
Fix #9710
authorSamuel Moelius <sam@moeli.us>
Tue, 25 Oct 2022 09:54:22 +0000 (05:54 -0400)
committerSamuel Moelius <sam@moeli.us>
Fri, 28 Oct 2022 12:53:06 +0000 (08:53 -0400)
clippy_lints/src/dereference.rs
tests/ui/needless_borrow.fixed
tests/ui/needless_borrow.rs

index 7e2e32a20d4fc3d2d074fb6e57a1a8d5d591866d..4d2f5eea1059c912818dcc9b045dc84a30baa5bc 100644 (file)
@@ -9,6 +9,7 @@
 };
 use rustc_ast::util::parser::{PREC_POSTFIX, PREC_PREFIX};
 use rustc_data_structures::fx::FxIndexMap;
+use rustc_data_structures::graph::iterate::{CycleDetector, TriColorDepthFirstSearch};
 use rustc_errors::Applicability;
 use rustc_hir::intravisit::{walk_ty, Visitor};
 use rustc_hir::{
@@ -1242,6 +1243,8 @@ fn referent_used_exactly_once<'a, 'tcx>(
         && let Some(statement) = mir.basic_blocks[location.block].statements.get(location.statement_index)
         && let StatementKind::Assign(box (_, Rvalue::Ref(_, _, place))) = statement.kind
         && !place.has_deref()
+        // Ensure not in a loop (https://github.com/rust-lang/rust-clippy/issues/9710)
+        && TriColorDepthFirstSearch::new(&mir.basic_blocks).run_from(location.block, &mut CycleDetector).is_none()
     {
         let body_owner_local_def_id = cx.tcx.hir().enclosing_body_owner(reference.hir_id);
         if possible_borrowers
index 57a682d62c0c0f30c0836eea62f2e6cab31b15e9..9931fab04ebcbab212ba1fc8d4421877a272957a 100644 (file)
@@ -408,3 +408,15 @@ mod issue_9111 {
         a.extend(&[]); // vs a.extend([]);
     }
 }
+
+#[allow(dead_code)]
+mod issue_9710 {
+    fn main() {
+        let string = String::new();
+        for _i in 0..10 {
+            f(&string);
+        }
+    }
+
+    fn f<T: AsRef<str>>(_: T) {}
+}
index 0d325b48ab8109822c735bf10a2c07a1d14f7a2a..4460f16d191b37b08b6d4aa6118d5c992a919350 100644 (file)
@@ -408,3 +408,15 @@ fn main() {
         a.extend(&[]); // vs a.extend([]);
     }
 }
+
+#[allow(dead_code)]
+mod issue_9710 {
+    fn main() {
+        let string = String::new();
+        for _i in 0..10 {
+            f(&string);
+        }
+    }
+
+    fn f<T: AsRef<str>>(_: T) {}
+}