Skip to content

Commit

Permalink
Auto merge of #85740 - flip1995:clippy_backport, r=Mark-Simulacrum
Browse files Browse the repository at this point in the history
[Beta] Backport ICE fix in Clippy

This backports an ICE / stack overflow fix from rust-lang/rust-clippy#7170.

cc rust-lang/rust-clippy#7169

cc `@llogiq` `@camsteffen`

r? `@Mark-Simulacrum`
  • Loading branch information
bors committed Jun 8, 2021
2 parents e7f4b8b + 47e2265 commit e79b979
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 4 deletions.
16 changes: 12 additions & 4 deletions src/tools/clippy/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 src/tools/clippy/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 src/tools/clippy/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 e79b979

Please sign in to comment.