mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-05 03:38:29 +00:00
Fix stack overflow in redundant_pattern_matching
This commit is contained in:
parent
7e538e3522
commit
344f04bea6
@ -1712,6 +1712,7 @@ mod redundant_pattern_match {
|
|||||||
use clippy_utils::{is_lang_ctor, is_qpath_def_path, is_trait_method, paths};
|
use clippy_utils::{is_lang_ctor, is_qpath_def_path, is_trait_method, paths};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_ast::ast::LitKind;
|
use rustc_ast::ast::LitKind;
|
||||||
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::LangItem::{OptionNone, OptionSome, PollPending, PollReady, ResultErr, ResultOk};
|
use rustc_hir::LangItem::{OptionNone, OptionSome, PollPending, PollReady, ResultErr, ResultOk};
|
||||||
use rustc_hir::{
|
use rustc_hir::{
|
||||||
@ -1739,6 +1740,13 @@ mod redundant_pattern_match {
|
|||||||
/// deallocate memory. For these types, and composites containing them, changing the drop order
|
/// deallocate memory. For these types, and composites containing them, changing the drop order
|
||||||
/// won't result in any observable side effects.
|
/// won't result in any observable side effects.
|
||||||
fn type_needs_ordered_drop(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -> bool {
|
fn type_needs_ordered_drop(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -> bool {
|
||||||
|
type_needs_ordered_drop_inner(cx, ty, &mut FxHashSet::default())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn type_needs_ordered_drop_inner(cx: &LateContext<'tcx>, ty: Ty<'tcx>, seen: &mut FxHashSet<Ty<'tcx>>) -> bool {
|
||||||
|
if !seen.insert(ty) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if !ty.needs_drop(cx.tcx, cx.param_env) {
|
if !ty.needs_drop(cx.tcx, cx.param_env) {
|
||||||
false
|
false
|
||||||
} else if !cx
|
} else if !cx
|
||||||
@ -1750,12 +1758,12 @@ mod redundant_pattern_match {
|
|||||||
// This type doesn't implement drop, so no side effects here.
|
// This type doesn't implement drop, so no side effects here.
|
||||||
// Check if any component type has any.
|
// Check if any component type has any.
|
||||||
match ty.kind() {
|
match ty.kind() {
|
||||||
ty::Tuple(_) => ty.tuple_fields().any(|ty| type_needs_ordered_drop(cx, ty)),
|
ty::Tuple(_) => ty.tuple_fields().any(|ty| type_needs_ordered_drop_inner(cx, ty, seen)),
|
||||||
ty::Array(ty, _) => type_needs_ordered_drop(cx, ty),
|
ty::Array(ty, _) => type_needs_ordered_drop_inner(cx, ty, seen),
|
||||||
ty::Adt(adt, subs) => adt
|
ty::Adt(adt, subs) => adt
|
||||||
.all_fields()
|
.all_fields()
|
||||||
.map(|f| f.ty(cx.tcx, subs))
|
.map(|f| f.ty(cx.tcx, subs))
|
||||||
.any(|ty| type_needs_ordered_drop(cx, ty)),
|
.any(|ty| type_needs_ordered_drop_inner(cx, ty, seen)),
|
||||||
_ => true,
|
_ => true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1772,7 +1780,7 @@ mod redundant_pattern_match {
|
|||||||
{
|
{
|
||||||
// Check all of the generic arguments.
|
// Check all of the generic arguments.
|
||||||
if let ty::Adt(_, subs) = ty.kind() {
|
if let ty::Adt(_, subs) = ty.kind() {
|
||||||
subs.types().any(|ty| type_needs_ordered_drop(cx, ty))
|
subs.types().any(|ty| type_needs_ordered_drop_inner(cx, ty, seen))
|
||||||
} else {
|
} else {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user