Auto merge of #7204 - flip1995:beta_backport, r=flip1995
Backport of #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.
This commit is contained in:
commit
c64b3ffbb5
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 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::{
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
|
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