about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--clippy_lints/src/reference.rs48
-rw-r--r--tests/ui/crashes/ice-6332.rs11
2 files changed, 39 insertions, 20 deletions
diff --git a/clippy_lints/src/reference.rs b/clippy_lints/src/reference.rs
index 35a1310d68b..efe3237990d 100644
--- a/clippy_lints/src/reference.rs
+++ b/clippy_lints/src/reference.rs
@@ -60,30 +60,38 @@ impl EarlyLintPass for DerefAddrOf {
                             }).map_or(span, |start_no_whitespace| e.span.with_lo(start_no_whitespace))
                         };
 
-                        let rpos = if *mutability == Mutability::Mut {
-                            macro_source.rfind("mut").expect("already checked this is a mutable reference") + "mut".len()
-                        } else {
-                            macro_source.rfind('&').expect("already checked this is a reference") + "&".len()
+                        let mut generate_snippet = |pattern: &str| {
+                            #[allow(clippy::cast_possible_truncation)]
+                            macro_source.rfind(pattern).map(|pattern_pos| {
+                                let rpos = pattern_pos + pattern.len();
+                                let span_after_ref = e.span.with_lo(BytePos(e.span.lo().0 + rpos as u32));
+                                let span = trim_leading_whitespaces(span_after_ref);
+                                snippet_with_applicability(cx, span, "_", &mut applicability)
+                            })
                         };
-                        #[allow(clippy::cast_possible_truncation)]
-                        let span_after_ref = e.span.with_lo(BytePos(e.span.lo().0 + rpos as u32));
-                        let span = trim_leading_whitespaces(span_after_ref);
-                        snippet_with_applicability(cx, span, "_", &mut applicability)
+
+                        if *mutability == Mutability::Mut {
+                            generate_snippet("mut")
+                        } else {
+                            generate_snippet("&")
+                        }
                     } else {
-                        snippet_with_applicability(cx, e.span, "_", &mut applicability)
+                        Some(snippet_with_applicability(cx, e.span, "_", &mut applicability))
                     }
                 } else {
-                    snippet_with_applicability(cx, addrof_target.span, "_", &mut applicability)
-                }.to_string();
-                span_lint_and_sugg(
-                    cx,
-                    DEREF_ADDROF,
-                    e.span,
-                    "immediately dereferencing a reference",
-                    "try this",
-                    sugg,
-                    applicability,
-                );
+                    Some(snippet_with_applicability(cx, addrof_target.span, "_", &mut applicability))
+                };
+                if let Some(sugg) = sugg {
+                    span_lint_and_sugg(
+                        cx,
+                        DEREF_ADDROF,
+                        e.span,
+                        "immediately dereferencing a reference",
+                        "try this",
+                        sugg.to_string(),
+                        applicability,
+                    );
+                }
             }
         }
     }
diff --git a/tests/ui/crashes/ice-6332.rs b/tests/ui/crashes/ice-6332.rs
new file mode 100644
index 00000000000..9dc92aa500b
--- /dev/null
+++ b/tests/ui/crashes/ice-6332.rs
@@ -0,0 +1,11 @@
+fn cmark_check() {
+    let mut link_err = false;
+    macro_rules! cmark_error {
+        ($bad:expr) => {
+            *$bad = true;
+        };
+    }
+    cmark_error!(&mut link_err);
+}
+
+pub fn main() {}