diff --git a/clippy_lints/src/matches.rs b/clippy_lints/src/matches.rs index 6b5b4e4c4f0..5aed9770d2e 100644 --- a/clippy_lints/src/matches.rs +++ b/clippy_lints/src/matches.rs @@ -713,16 +713,18 @@ fn all_ranges<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, arms: &'tcx [Arm<'_>]) -> Ve } = *arm { if let PatKind::Range(ref lhs, ref rhs, ref range_end) = pat.kind { - let lhs = constant(cx, cx.tables, lhs)?.0; - let rhs = constant(cx, cx.tables, rhs)?.0; - let rhs = match *range_end { - RangeEnd::Included => Bound::Included(rhs), - RangeEnd::Excluded => Bound::Excluded(rhs), - }; - return Some(SpannedRange { - span: pat.span, - node: (lhs, rhs), - }); + if let (Some(l), Some(r)) = (lhs, rhs) { + let lhs = constant(cx, cx.tables, l)?.0; + let rhs = constant(cx, cx.tables, r)?.0; + let rhs = match *range_end { + RangeEnd::Included => Bound::Included(rhs), + RangeEnd::Excluded => Bound::Excluded(rhs), + }; + return Some(SpannedRange { + span: pat.span, + node: (lhs, rhs), + }); + } } if let PatKind::Lit(ref value) = pat.kind { diff --git a/clippy_lints/src/utils/author.rs b/clippy_lints/src/utils/author.rs index 902c3e2b7e7..b9f11f79a37 100644 --- a/clippy_lints/src/utils/author.rs +++ b/clippy_lints/src/utils/author.rs @@ -617,9 +617,13 @@ impl<'tcx> Visitor<'tcx> for PrintVisitor { start_pat, end_pat, end_kind, current ); self.current = start_pat; - self.visit_expr(start); + if let Some(expr) = start { + self.visit_expr(expr); + } self.current = end_pat; - self.visit_expr(end); + if let Some(expr) = end { + self.visit_expr(expr); + } }, PatKind::Slice(ref start, ref middle, ref end) => { let start_pat = self.next("start"); diff --git a/clippy_lints/src/utils/hir_utils.rs b/clippy_lints/src/utils/hir_utils.rs index 13ea90cff59..00baad72e6d 100644 --- a/clippy_lints/src/utils/hir_utils.rs +++ b/clippy_lints/src/utils/hir_utils.rs @@ -195,7 +195,10 @@ impl<'a, 'tcx> SpanlessEq<'a, 'tcx> { ls == rs && over(l, r, |l, r| self.eq_pat(l, r)) }, (&PatKind::Range(ref ls, ref le, ref li), &PatKind::Range(ref rs, ref re, ref ri)) => { - self.eq_expr(ls, rs) && self.eq_expr(le, re) && (*li == *ri) + if let (Some(ls), Some(rs), Some(le), Some(re)) = (ls, rs, le, re) { + return self.eq_expr(ls, rs) && self.eq_expr(le, re) && (*li == *ri); + } + false }, (&PatKind::Ref(ref le, ref lm), &PatKind::Ref(ref re, ref rm)) => lm == rm && self.eq_pat(le, re), (&PatKind::Slice(ref ls, ref li, ref le), &PatKind::Slice(ref rs, ref ri, ref re)) => { diff --git a/clippy_lints/src/utils/inspector.rs b/clippy_lints/src/utils/inspector.rs index 38bf6ee5239..eb889ccc75c 100644 --- a/clippy_lints/src/utils/inspector.rs +++ b/clippy_lints/src/utils/inspector.rs @@ -483,8 +483,12 @@ fn print_pat(cx: &LateContext<'_, '_>, pat: &hir::Pat<'_>, indent: usize) { }, hir::PatKind::Range(ref l, ref r, ref range_end) => { println!("{}Range", ind); - print_expr(cx, l, indent + 1); - print_expr(cx, r, indent + 1); + if let Some(expr) = l { + print_expr(cx, expr, indent + 1); + } + if let Some(expr) = r { + print_expr(cx, expr, indent + 1); + } match *range_end { hir::RangeEnd::Included => println!("{} end included", ind), hir::RangeEnd::Excluded => println!("{} end excluded", ind),