//@aux-build:proc_macros.rs #![allow( unused_variables, dead_code, clippy::derive_partial_eq_without_eq, clippy::needless_if )] #![warn(clippy::equatable_if_let)] extern crate proc_macros; use proc_macros::{external, inline_macros}; use std::cmp::Ordering; #[derive(PartialEq)] enum Enum { TupleVariant(i32, u64), RecordVariant { a: i64, b: u32 }, UnitVariant, Recursive(Struct), } #[derive(PartialEq)] struct Struct { a: i32, b: bool, } struct NoPartialEqStruct { a: i32, b: bool, } enum NotPartialEq { A, B, } enum NotStructuralEq { A, B, } impl PartialEq for NotStructuralEq { fn eq(&self, _: &NotStructuralEq) -> bool { false } } #[inline_macros] fn main() { let a = 2; let b = 3; let c = Some(2); let d = Struct { a: 2, b: false }; let e = Enum::UnitVariant; let f = NotPartialEq::A; let g = NotStructuralEq::A; let h = NoPartialEqStruct { a: 2, b: false }; // true if let 2 = a {} //~^ equatable_if_let if let Ordering::Greater = a.cmp(&b) {} //~^ equatable_if_let if let Some(2) = c {} //~^ equatable_if_let if let Struct { a: 2, b: false } = d {} //~^ equatable_if_let if let Enum::TupleVariant(32, 64) = e {} //~^ equatable_if_let if let Enum::RecordVariant { a: 64, b: 32 } = e {} //~^ equatable_if_let if let Enum::UnitVariant = e {} //~^ equatable_if_let if let (Enum::UnitVariant, &Struct { a: 2, b: false }) = (e, &d) {} //~^ equatable_if_let // false if let 2 | 3 = a {} if let x @ 2 = a {} if let Some(3 | 4) = c {} if let Struct { a, b: false } = d {} if let Struct { a: 2, b: x } = d {} if let NotPartialEq::A = f {} //~^ equatable_if_let if let NotStructuralEq::A = g {} //~^ equatable_if_let if let Some(NotPartialEq::A) = Some(f) {} //~^ equatable_if_let if let Some(NotStructuralEq::A) = Some(g) {} //~^ equatable_if_let if let NoPartialEqStruct { a: 2, b: false } = h {} //~^ equatable_if_let if let inline!("abc") = "abc" { //~^ equatable_if_let println!("OK"); } external!({ if let 2 = $a {} }); } mod issue8710 { fn str_ref(cs: &[char]) { if let Some('i') = cs.iter().next() { //~^ equatable_if_let } else { todo!(); } } fn i32_ref(cs: &[i32]) { if let Some(1) = cs.iter().next() { //~^ equatable_if_let } else { todo!(); } } fn enum_ref() { #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] enum MyEnum { A(i32), B, } fn get_enum() -> Option<&'static MyEnum> { todo!() } if let Some(MyEnum::B) = get_enum() { //~^ equatable_if_let } else { todo!(); } } }