mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-01 17:42:47 +00:00
Fix use_self ICE
This commit is contained in:
parent
c195db7fee
commit
cb4670deb3
@ -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(..)
|
||||
)
|
||||
}
|
||||
|
13
tests/ui/crashes/ice-7423.rs
Normal file
13
tests/ui/crashes/ice-7423.rs
Normal file
@ -0,0 +1,13 @@
|
||||
pub trait Trait {
|
||||
fn f();
|
||||
}
|
||||
|
||||
impl Trait for usize {
|
||||
fn f() {
|
||||
extern "C" {
|
||||
fn g() -> usize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
Loading…
Reference in New Issue
Block a user