about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2023-02-14 14:50:08 +0100
committerSamuel Tardieu <sam@rfc1149.net>2023-02-14 15:37:48 +0100
commite4e5924b99b30c693bc87aa95ef51fd2263b6280 (patch)
tree7cb29fe6c77a769fedf6e7b7ed295e3cd4fb930d
parent63562a6854f1ec95f5e53936b5cec65a58aca1da (diff)
downloadrust-e4e5924b99b30c693bc87aa95ef51fd2263b6280.tar.gz
rust-e4e5924b99b30c693bc87aa95ef51fd2263b6280.zip
Do not base map_entry lint suggestion on expanded code
-rw-r--r--clippy_lints/src/entry.rs4
-rw-r--r--tests/ui/entry.fixed14
-rw-r--r--tests/ui/entry.rs14
3 files changed, 32 insertions, 0 deletions
diff --git a/clippy_lints/src/entry.rs b/clippy_lints/src/entry.rs
index b44e6243588..ed9d94cdec3 100644
--- a/clippy_lints/src/entry.rs
+++ b/clippy_lints/src/entry.rs
@@ -65,6 +65,10 @@ declare_lint_pass!(HashMapPass => [MAP_ENTRY]);
 impl<'tcx> LateLintPass<'tcx> for HashMapPass {
     #[expect(clippy::too_many_lines)]
     fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
+        if expr.span.from_expansion() {
+            return;
+        }
+
         let Some(higher::If { cond: cond_expr, then: then_expr, r#else: else_expr }) = higher::If::hir(expr) else {
             return
         };
diff --git a/tests/ui/entry.fixed b/tests/ui/entry.fixed
index 79c29c04e05..dbe09e0ff3c 100644
--- a/tests/ui/entry.fixed
+++ b/tests/ui/entry.fixed
@@ -152,4 +152,18 @@ fn hash_map<K: Eq + Hash + Copy, V: Copy>(m: &mut HashMap<K, V>, m2: &mut HashMa
     });
 }
 
+// Issue 10331
+// do not suggest a bad expansion because the compiler unrolls the first
+// occurrence of the loop
+pub fn issue_10331() {
+    let mut m = HashMap::new();
+    let mut i = 0;
+    let mut x = 0;
+    while !m.contains_key(&x) {
+        m.insert(x, i);
+        i += 1;
+        x += 1;
+    }
+}
+
 fn main() {}
diff --git a/tests/ui/entry.rs b/tests/ui/entry.rs
index 2d7985457d8..30fed34fc5d 100644
--- a/tests/ui/entry.rs
+++ b/tests/ui/entry.rs
@@ -156,4 +156,18 @@ fn hash_map<K: Eq + Hash + Copy, V: Copy>(m: &mut HashMap<K, V>, m2: &mut HashMa
     }
 }
 
+// Issue 10331
+// do not suggest a bad expansion because the compiler unrolls the first
+// occurrence of the loop
+pub fn issue_10331() {
+    let mut m = HashMap::new();
+    let mut i = 0;
+    let mut x = 0;
+    while !m.contains_key(&x) {
+        m.insert(x, i);
+        i += 1;
+        x += 1;
+    }
+}
+
 fn main() {}