mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-27 07:00:55 +00:00
Auto merge of #7170 - flip1995:revert_drop_order, r=llogiq
Fix stack overflow issue in `redundant_pattern_matching` Fixes #7169 ~~cc `@Jarcho` Since tomorrow is release day and we need to get this also fixed in beta, I'll just revert the PR instead of looking into the root issue. Your changes are good, so if you have an idea what could cause this stack overflow and know how to fix it, please open a PR that reverts this revert with a fix.~~ r? `@llogiq` changelog: none (fixes stack overflow, but this was introduced in this release cycle)
This commit is contained in:
commit
182a1853c3
3 changed files with 31 additions and 4 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
9
tests/ui/crashes/ice-7169.rs
Normal file
9
tests/ui/crashes/ice-7169.rs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#[derive(Default)]
|
||||||
|
struct A<T> {
|
||||||
|
a: Vec<A<T>>,
|
||||||
|
b: T,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
if let Ok(_) = Ok::<_, ()>(A::<String>::default()) {}
|
||||||
|
}
|
10
tests/ui/crashes/ice-7169.stderr
Normal file
10
tests/ui/crashes/ice-7169.stderr
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
error: redundant pattern matching, consider using `is_ok()`
|
||||||
|
--> $DIR/ice-7169.rs:8:12
|
||||||
|
|
|
||||||
|
LL | if let Ok(_) = Ok::<_, ()>(A::<String>::default()) {}
|
||||||
|
| -------^^^^^-------------------------------------- help: try this: `if Ok::<_, ()>(A::<String>::default()).is_ok()`
|
||||||
|
|
|
||||||
|
= note: `-D clippy::redundant-pattern-matching` implied by `-D warnings`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
Reference in a new issue