Skip to content

Commit

Permalink
Auto merge of rust-lang#7204 - flip1995:beta_backport, r=flip1995
Browse files Browse the repository at this point in the history
Backport of rust-lang#7170 to beta

r? `@ghost`

changelog: none (fixes stack overflow, but this was introduced in this release cycle)

Now actually opened towards the `beta` branch.
  • Loading branch information
bors committed May 10, 2021
2 parents 7c7683c + 98b11c8 commit c64b3ff
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 4 deletions.
16 changes: 12 additions & 4 deletions clippy_lints/src/matches.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1712,6 +1712,7 @@ mod redundant_pattern_match {
use clippy_utils::{is_lang_ctor, is_qpath_def_path, is_trait_method, paths};
use if_chain::if_chain;
use rustc_ast::ast::LitKind;
use rustc_data_structures::fx::FxHashSet;
use rustc_errors::Applicability;
use rustc_hir::LangItem::{OptionNone, OptionSome, PollPending, PollReady, ResultErr, ResultOk};
use rustc_hir::{
Expand Down Expand Up @@ -1739,6 +1740,13 @@ mod redundant_pattern_match {
/// deallocate memory. For these types, and composites containing them, changing the drop order
/// won't result in any observable side effects.
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) {
false
} else if !cx
Expand All @@ -1750,12 +1758,12 @@ mod redundant_pattern_match {
// This type doesn't implement drop, so no side effects here.
// Check if any component type has any.
match ty.kind() {
ty::Tuple(_) => ty.tuple_fields().any(|ty| type_needs_ordered_drop(cx, ty)),
ty::Array(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_inner(cx, ty, seen),
ty::Adt(adt, subs) => adt
.all_fields()
.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,
}
}
Expand All @@ -1772,7 +1780,7 @@ mod redundant_pattern_match {
{
// Check all of the generic arguments.
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 {
true
}
Expand Down
9 changes: 9 additions & 0 deletions tests/ui/crashes/ice-7169.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 10 additions & 0 deletions tests/ui/crashes/ice-7169.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit c64b3ff

Please sign in to comment.