]> git.lizzy.rs Git - rust.git/commitdiff
Possibly fix an ICE on test
authorYuki Okushi <huyuumi.dev@gmail.com>
Sat, 28 Dec 2019 12:13:21 +0000 (21:13 +0900)
committerYuki Okushi <huyuumi.dev@gmail.com>
Sat, 28 Dec 2019 13:30:44 +0000 (22:30 +0900)
clippy_lints/src/mut_key.rs

index 03f9d522f0a4081830e2f82e0b49c8eaf8a95a28..ef3ae45f181731f0b35a165a9da5ba9e6b4d5780 100644 (file)
@@ -103,18 +103,23 @@ fn check_ty<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, span: Span, ty: Ty<'tcx>) {
             .iter()
             .any(|path| match_def_path(cx, def.did, &**path))
         {
-            let key_type = substs.type_at(0);
-            if is_concrete_type(key_type) && !key_type.is_freeze(cx.tcx, cx.param_env, span) {
-                span_lint(cx, MUTABLE_KEY_TYPE, span, "mutable key type");
+            let key_type = concrete_type(Some(substs.type_at(0)));
+            if let Some(key_type) = key_type {
+                if !key_type.is_freeze(cx.tcx, cx.param_env, span) {
+                    span_lint(cx, MUTABLE_KEY_TYPE, span, "mutable key type");
+                }
             }
         }
     }
 }
 
-fn is_concrete_type(ty: Ty<'_>) -> bool {
-    match ty.kind {
-        RawPtr(TypeAndMut { ty: inner_ty, .. }) | Ref(_, inner_ty, _) => is_concrete_type(inner_ty),
-        Dynamic(..) | Opaque(..) | Param(..) => false,
-        _ => true,
+fn concrete_type(ty: Option<Ty<'_>>) -> Option<Ty<'_>> {
+    if let Some(ty) = ty {
+        match ty.kind {
+            RawPtr(TypeAndMut { ty: inner_ty, .. }) | Ref(_, inner_ty, _) => return concrete_type(Some(inner_ty)),
+            Dynamic(..) | Opaque(..) | Param(..) => return None,
+            _ => return Some(ty),
+        }
     }
+    None
 }