From fbdb13cfb02b320fbee061bcf58af885bd2847df Mon Sep 17 00:00:00 2001 From: Yuki Okushi <huyuumi.dev@gmail.com> Date: Sat, 28 Dec 2019 21:13:21 +0900 Subject: [PATCH 1/2] Possibly fix an ICE on test --- clippy_lints/src/mut_key.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/clippy_lints/src/mut_key.rs b/clippy_lints/src/mut_key.rs index 03f9d522f0a..ef3ae45f181 100644 --- a/clippy_lints/src/mut_key.rs +++ b/clippy_lints/src/mut_key.rs @@ -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 } From bca125935c2780bb97faa9fca3cea1b84df7f973 Mon Sep 17 00:00:00 2001 From: Yuki Okushi <huyuumi.dev@gmail.com> Date: Sat, 28 Dec 2019 22:45:41 +0900 Subject: [PATCH 2/2] code review --- clippy_lints/src/mut_key.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/clippy_lints/src/mut_key.rs b/clippy_lints/src/mut_key.rs index ef3ae45f181..6acf9028422 100644 --- a/clippy_lints/src/mut_key.rs +++ b/clippy_lints/src/mut_key.rs @@ -103,7 +103,7 @@ 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 = concrete_type(Some(substs.type_at(0))); + let key_type = concrete_type(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"); @@ -113,13 +113,10 @@ fn check_ty<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, span: Span, ty: Ty<'tcx>) { } } -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), - } +fn concrete_type(ty: Ty<'_>) -> Option<Ty<'_>> { + match ty.kind { + RawPtr(TypeAndMut { ty: inner_ty, .. }) | Ref(_, inner_ty, _) => concrete_type(inner_ty), + Dynamic(..) | Opaque(..) | Param(..) => None, + _ => Some(ty), } - None }