From cb4670deb37dac43dc36ad22d97479921a971f71 Mon Sep 17 00:00:00 2001 From: Cameron Steffen Date: Sat, 3 Jul 2021 12:40:50 -0500 Subject: [PATCH] Fix use_self ICE --- clippy_lints/src/use_self.rs | 17 +++-------------- tests/ui/crashes/ice-7423.rs | 13 +++++++++++++ 2 files changed, 16 insertions(+), 14 deletions(-) create mode 100644 tests/ui/crashes/ice-7423.rs diff --git a/clippy_lints/src/use_self.rs b/clippy_lints/src/use_self.rs index 906ac10f461..71117e967e3 100644 --- a/clippy_lints/src/use_self.rs +++ b/clippy_lints/src/use_self.rs @@ -87,11 +87,8 @@ const SEGMENTS_MSG: &str = "segments should be composed of at least 1 element"; impl<'tcx> LateLintPass<'tcx> for UseSelf { fn check_item(&mut self, _cx: &LateContext<'_>, item: &Item<'_>) { - if !is_item_interesting(item) { - // This does two things: - // 1) Reduce needless churn on `self.stack` - // 2) Don't push `StackItem::NoCheck` when entering `ItemKind::OpaqueTy`, - // in order to lint `foo() -> impl <..>` + if matches!(item.kind, ItemKind::OpaqueTy(_)) { + // skip over `ItemKind::OpaqueTy` in order to lint `foo() -> impl <..>` return; } // We push the self types of `impl`s on a stack here. Only the top type on the stack is @@ -119,7 +116,7 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf { } fn check_item_post(&mut self, _: &LateContext<'_>, item: &Item<'_>) { - if is_item_interesting(item) { + if !matches!(item.kind, ItemKind::OpaqueTy(_)) { self.stack.pop(); } } @@ -297,11 +294,3 @@ fn lint_path_to_variant(cx: &LateContext<'_>, path: &Path<'_>) { span_lint(cx, span); } } - -fn is_item_interesting(item: &Item<'_>) -> bool { - use rustc_hir::ItemKind::{Const, Enum, Fn, Impl, Static, Struct, Trait, Union}; - matches!( - item.kind, - Impl { .. } | Static(..) | Const(..) | Fn(..) | Enum(..) | Struct(..) | Union(..) | Trait(..) - ) -} diff --git a/tests/ui/crashes/ice-7423.rs b/tests/ui/crashes/ice-7423.rs new file mode 100644 index 00000000000..31340b012dd --- /dev/null +++ b/tests/ui/crashes/ice-7423.rs @@ -0,0 +1,13 @@ +pub trait Trait { + fn f(); +} + +impl Trait for usize { + fn f() { + extern "C" { + fn g() -> usize; + } + } +} + +fn main() {}