Fix use_self ICE

This commit is contained in:
Cameron Steffen 2021-07-03 12:40:50 -05:00
parent c195db7fee
commit cb4670deb3
2 changed files with 16 additions and 14 deletions

View file

@ -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(..)
)
}

View file

@ -0,0 +1,13 @@
pub trait Trait {
fn f();
}
impl Trait for usize {
fn f() {
extern "C" {
fn g() -> usize;
}
}
}
fn main() {}