error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:14:5
   |
LL |     matches!(maybe_some, None if !boolean)
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `maybe_some.is_none() && (!boolean)`
   |
   = note: `-D clippy::redundant-pattern-matching` implied by `-D warnings`
   = help: to override `-D warnings` add `#[allow(clippy::redundant_pattern_matching)]`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:18:13
   |
LL |     let _ = matches!(maybe_some, None if boolean || boolean2); // guard needs parentheses
   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `maybe_some.is_none() && (boolean || boolean2)`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:32:12
   |
LL |     if let None = None::<()> {}
   |     -------^^^^------------- help: try: `if None::<()>.is_none()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:34:12
   |
LL |     if let Some(_) = Some(42) {}
   |     -------^^^^^^^----------- help: try: `if Some(42).is_some()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:36:12
   |
LL |     if let Some(_) = Some(42) {
   |     -------^^^^^^^----------- help: try: `if Some(42).is_some()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:42:15
   |
LL |     while let Some(_) = Some(42) {}
   |     ----------^^^^^^^----------- help: try: `while Some(42).is_some()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:44:15
   |
LL |     while let None = Some(42) {}
   |     ----------^^^^----------- help: try: `while Some(42).is_none()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:46:15
   |
LL |     while let None = None::<()> {}
   |     ----------^^^^------------- help: try: `while None::<()>.is_none()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:49:15
   |
LL |     while let Some(_) = v.pop() {
   |     ----------^^^^^^^---------- help: try: `while v.pop().is_some()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:57:5
   |
LL | /     match Some(42) {
LL | |         Some(_) => true,
LL | |         None => false,
LL | |     };
   | |_____^ help: try: `Some(42).is_some()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:62:5
   |
LL | /     match None::<()> {
LL | |         Some(_) => false,
LL | |         None => true,
LL | |     };
   | |_____^ help: try: `None::<()>.is_none()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:67:13
   |
LL |       let _ = match None::<()> {
   |  _____________^
LL | |         Some(_) => false,
LL | |         None => true,
LL | |     };
   | |_____^ help: try: `None::<()>.is_none()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:73:20
   |
LL |     let _ = if let Some(_) = opt { true } else { false };
   |             -------^^^^^^^------ help: try: `if opt.is_some()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:79:20
   |
LL |     let _ = if let Some(_) = gen_opt() {
   |             -------^^^^^^^------------ help: try: `if gen_opt().is_some()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:81:19
   |
LL |     } else if let None = gen_opt() {
   |            -------^^^^------------ help: try: `if gen_opt().is_none()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:87:12
   |
LL |     if let Some(..) = gen_opt() {}
   |     -------^^^^^^^^------------ help: try: `if gen_opt().is_some()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:102:12
   |
LL |     if let Some(_) = Some(42) {}
   |     -------^^^^^^^----------- help: try: `if Some(42).is_some()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:104:12
   |
LL |     if let None = None::<()> {}
   |     -------^^^^------------- help: try: `if None::<()>.is_none()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:106:15
   |
LL |     while let Some(_) = Some(42) {}
   |     ----------^^^^^^^----------- help: try: `while Some(42).is_some()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:108:15
   |
LL |     while let None = None::<()> {}
   |     ----------^^^^------------- help: try: `while None::<()>.is_none()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:110:5
   |
LL | /     match Some(42) {
LL | |         Some(_) => true,
LL | |         None => false,
LL | |     };
   | |_____^ help: try: `Some(42).is_some()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:115:5
   |
LL | /     match None::<()> {
LL | |         Some(_) => false,
LL | |         None => true,
LL | |     };
   | |_____^ help: try: `None::<()>.is_none()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:123:12
   |
LL |     if let None = *(&None::<()>) {}
   |     -------^^^^----------------- help: try: `if (&None::<()>).is_none()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:124:12
   |
LL |     if let None = *&None::<()> {}
   |     -------^^^^--------------- help: try: `if (&None::<()>).is_none()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:130:5
   |
LL | /     match x {
LL | |         Some(_) => true,
LL | |         _ => false,
LL | |     };
   | |_____^ help: try: `x.is_some()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:135:5
   |
LL | /     match x {
LL | |         None => true,
LL | |         _ => false,
LL | |     };
   | |_____^ help: try: `x.is_none()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:140:5
   |
LL | /     match x {
LL | |         Some(_) => false,
LL | |         _ => true,
LL | |     };
   | |_____^ help: try: `x.is_none()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:145:5
   |
LL | /     match x {
LL | |         None => false,
LL | |         _ => true,
LL | |     };
   | |_____^ help: try: `x.is_some()`

error: redundant pattern matching, consider using `is_some()`
  --> $DIR/redundant_pattern_matching_option.rs:160:13
   |
LL |     let _ = matches!(x, Some(_));
   |             ^^^^^^^^^^^^^^^^^^^^ help: try: `x.is_some()`

error: redundant pattern matching, consider using `is_none()`
  --> $DIR/redundant_pattern_matching_option.rs:162:13
   |
LL |     let _ = matches!(x, None);
   |             ^^^^^^^^^^^^^^^^^ help: try: `x.is_none()`

error: aborting due to 30 previous errors

