6459: Check for redundant matches! with Ready, Pending, V4, V6

This commit is contained in:
Florian Brucker 2023-12-27 18:53:48 +01:00
parent c689d32a90
commit ebc0588937
7 changed files with 98 additions and 56 deletions

View File

@ -411,31 +411,25 @@ fn get_good_method<'tcx>(
path_left: &QPath<'_>, path_left: &QPath<'_>,
) -> Option<(&'static str, Option<&'tcx Guard<'tcx>>)> { ) -> Option<(&'static str, Option<&'tcx Guard<'tcx>>)> {
if let Some(name) = get_ident(path_left) { if let Some(name) = get_ident(path_left) {
return match name.as_str() { let (expected_item_left, should_be_left, should_be_right) = match name.as_str() {
"Ok" => { "Ok" => (Item::Lang(ResultOk), "is_ok()", "is_err()"),
find_good_method_for_matches_macro(cx, arms, path_left, Item::Lang(ResultOk), "is_ok()", "is_err()") "Err" => (Item::Lang(ResultErr), "is_err()", "is_ok()"),
}, "Some" => (Item::Lang(OptionSome), "is_some()", "is_none()"),
"Err" => { "None" => (Item::Lang(OptionNone), "is_none()", "is_some()"),
find_good_method_for_matches_macro(cx, arms, path_left, Item::Lang(ResultErr), "is_err()", "is_ok()") "Ready" => (Item::Lang(PollReady), "is_ready()", "is_pending()"),
}, "Pending" => (Item::Lang(PollPending), "is_pending()", "is_ready()"),
"Some" => find_good_method_for_matches_macro( "V4" => (Item::Diag(sym::IpAddr, sym!(V4)), "is_ipv4()", "is_ipv6()"),
cx, "V6" => (Item::Diag(sym::IpAddr, sym!(V6)), "is_ipv6()", "is_ipv4()"),
arms, _ => return None,
path_left,
Item::Lang(OptionSome),
"is_some()",
"is_none()",
),
"None" => find_good_method_for_matches_macro(
cx,
arms,
path_left,
Item::Lang(OptionNone),
"is_none()",
"is_some()",
),
_ => None,
}; };
return find_good_method_for_matches_macro(
cx,
arms,
path_left,
expected_item_left,
should_be_left,
should_be_right,
);
} }
None None
} }

View File

@ -18,6 +18,12 @@ fn main() {
if V6(Ipv6Addr::LOCALHOST).is_ipv6() {} if V6(Ipv6Addr::LOCALHOST).is_ipv6() {}
// Issue 6459
if V4(Ipv4Addr::LOCALHOST).is_ipv4() {}
// Issue 6459
if V6(Ipv6Addr::LOCALHOST).is_ipv6() {}
while V4(Ipv4Addr::LOCALHOST).is_ipv4() {} while V4(Ipv4Addr::LOCALHOST).is_ipv4() {}
while V6(Ipv6Addr::LOCALHOST).is_ipv6() {} while V6(Ipv6Addr::LOCALHOST).is_ipv6() {}

View File

@ -18,6 +18,12 @@ fn main() {
if let V6(_) = V6(Ipv6Addr::LOCALHOST) {} if let V6(_) = V6(Ipv6Addr::LOCALHOST) {}
// Issue 6459
if matches!(V4(Ipv4Addr::LOCALHOST), V4(_)) {}
// Issue 6459
if matches!(V6(Ipv6Addr::LOCALHOST), V6(_)) {}
while let V4(_) = V4(Ipv4Addr::LOCALHOST) {} while let V4(_) = V4(Ipv4Addr::LOCALHOST) {}
while let V6(_) = V6(Ipv6Addr::LOCALHOST) {} while let V6(_) = V6(Ipv6Addr::LOCALHOST) {}

View File

@ -20,19 +20,31 @@ LL | if let V6(_) = V6(Ipv6Addr::LOCALHOST) {}
| -------^^^^^-------------------------- help: try: `if V6(Ipv6Addr::LOCALHOST).is_ipv6()` | -------^^^^^-------------------------- help: try: `if V6(Ipv6Addr::LOCALHOST).is_ipv6()`
error: redundant pattern matching, consider using `is_ipv4()` error: redundant pattern matching, consider using `is_ipv4()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:21:15 --> $DIR/redundant_pattern_matching_ipaddr.rs:22:8
|
LL | if matches!(V4(Ipv4Addr::LOCALHOST), V4(_)) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `V4(Ipv4Addr::LOCALHOST).is_ipv4()`
error: redundant pattern matching, consider using `is_ipv6()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:25:8
|
LL | if matches!(V6(Ipv6Addr::LOCALHOST), V6(_)) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `V6(Ipv6Addr::LOCALHOST).is_ipv6()`
error: redundant pattern matching, consider using `is_ipv4()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:27:15
| |
LL | while let V4(_) = V4(Ipv4Addr::LOCALHOST) {} LL | while let V4(_) = V4(Ipv4Addr::LOCALHOST) {}
| ----------^^^^^-------------------------- help: try: `while V4(Ipv4Addr::LOCALHOST).is_ipv4()` | ----------^^^^^-------------------------- help: try: `while V4(Ipv4Addr::LOCALHOST).is_ipv4()`
error: redundant pattern matching, consider using `is_ipv6()` error: redundant pattern matching, consider using `is_ipv6()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:23:15 --> $DIR/redundant_pattern_matching_ipaddr.rs:29:15
| |
LL | while let V6(_) = V6(Ipv6Addr::LOCALHOST) {} LL | while let V6(_) = V6(Ipv6Addr::LOCALHOST) {}
| ----------^^^^^-------------------------- help: try: `while V6(Ipv6Addr::LOCALHOST).is_ipv6()` | ----------^^^^^-------------------------- help: try: `while V6(Ipv6Addr::LOCALHOST).is_ipv6()`
error: redundant pattern matching, consider using `is_ipv4()` error: redundant pattern matching, consider using `is_ipv4()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:33:5 --> $DIR/redundant_pattern_matching_ipaddr.rs:39:5
| |
LL | / match V4(Ipv4Addr::LOCALHOST) { LL | / match V4(Ipv4Addr::LOCALHOST) {
LL | | V4(_) => true, LL | | V4(_) => true,
@ -41,7 +53,7 @@ LL | | };
| |_____^ help: try: `V4(Ipv4Addr::LOCALHOST).is_ipv4()` | |_____^ help: try: `V4(Ipv4Addr::LOCALHOST).is_ipv4()`
error: redundant pattern matching, consider using `is_ipv6()` error: redundant pattern matching, consider using `is_ipv6()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:38:5 --> $DIR/redundant_pattern_matching_ipaddr.rs:44:5
| |
LL | / match V4(Ipv4Addr::LOCALHOST) { LL | / match V4(Ipv4Addr::LOCALHOST) {
LL | | V4(_) => false, LL | | V4(_) => false,
@ -50,7 +62,7 @@ LL | | };
| |_____^ help: try: `V4(Ipv4Addr::LOCALHOST).is_ipv6()` | |_____^ help: try: `V4(Ipv4Addr::LOCALHOST).is_ipv6()`
error: redundant pattern matching, consider using `is_ipv6()` error: redundant pattern matching, consider using `is_ipv6()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:43:5 --> $DIR/redundant_pattern_matching_ipaddr.rs:49:5
| |
LL | / match V6(Ipv6Addr::LOCALHOST) { LL | / match V6(Ipv6Addr::LOCALHOST) {
LL | | V4(_) => false, LL | | V4(_) => false,
@ -59,7 +71,7 @@ LL | | };
| |_____^ help: try: `V6(Ipv6Addr::LOCALHOST).is_ipv6()` | |_____^ help: try: `V6(Ipv6Addr::LOCALHOST).is_ipv6()`
error: redundant pattern matching, consider using `is_ipv4()` error: redundant pattern matching, consider using `is_ipv4()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:48:5 --> $DIR/redundant_pattern_matching_ipaddr.rs:54:5
| |
LL | / match V6(Ipv6Addr::LOCALHOST) { LL | / match V6(Ipv6Addr::LOCALHOST) {
LL | | V4(_) => true, LL | | V4(_) => true,
@ -68,49 +80,49 @@ LL | | };
| |_____^ help: try: `V6(Ipv6Addr::LOCALHOST).is_ipv4()` | |_____^ help: try: `V6(Ipv6Addr::LOCALHOST).is_ipv4()`
error: redundant pattern matching, consider using `is_ipv4()` error: redundant pattern matching, consider using `is_ipv4()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:53:20 --> $DIR/redundant_pattern_matching_ipaddr.rs:59:20
| |
LL | let _ = if let V4(_) = V4(Ipv4Addr::LOCALHOST) { LL | let _ = if let V4(_) = V4(Ipv4Addr::LOCALHOST) {
| -------^^^^^-------------------------- help: try: `if V4(Ipv4Addr::LOCALHOST).is_ipv4()` | -------^^^^^-------------------------- help: try: `if V4(Ipv4Addr::LOCALHOST).is_ipv4()`
error: redundant pattern matching, consider using `is_ipv4()` error: redundant pattern matching, consider using `is_ipv4()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:61:20 --> $DIR/redundant_pattern_matching_ipaddr.rs:67:20
| |
LL | let _ = if let V4(_) = gen_ipaddr() { LL | let _ = if let V4(_) = gen_ipaddr() {
| -------^^^^^--------------- help: try: `if gen_ipaddr().is_ipv4()` | -------^^^^^--------------- help: try: `if gen_ipaddr().is_ipv4()`
error: redundant pattern matching, consider using `is_ipv6()` error: redundant pattern matching, consider using `is_ipv6()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:63:19 --> $DIR/redundant_pattern_matching_ipaddr.rs:69:19
| |
LL | } else if let V6(_) = gen_ipaddr() { LL | } else if let V6(_) = gen_ipaddr() {
| -------^^^^^--------------- help: try: `if gen_ipaddr().is_ipv6()` | -------^^^^^--------------- help: try: `if gen_ipaddr().is_ipv6()`
error: redundant pattern matching, consider using `is_ipv4()` error: redundant pattern matching, consider using `is_ipv4()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:75:12 --> $DIR/redundant_pattern_matching_ipaddr.rs:81:12
| |
LL | if let V4(_) = V4(Ipv4Addr::LOCALHOST) {} LL | if let V4(_) = V4(Ipv4Addr::LOCALHOST) {}
| -------^^^^^-------------------------- help: try: `if V4(Ipv4Addr::LOCALHOST).is_ipv4()` | -------^^^^^-------------------------- help: try: `if V4(Ipv4Addr::LOCALHOST).is_ipv4()`
error: redundant pattern matching, consider using `is_ipv6()` error: redundant pattern matching, consider using `is_ipv6()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:77:12 --> $DIR/redundant_pattern_matching_ipaddr.rs:83:12
| |
LL | if let V6(_) = V6(Ipv6Addr::LOCALHOST) {} LL | if let V6(_) = V6(Ipv6Addr::LOCALHOST) {}
| -------^^^^^-------------------------- help: try: `if V6(Ipv6Addr::LOCALHOST).is_ipv6()` | -------^^^^^-------------------------- help: try: `if V6(Ipv6Addr::LOCALHOST).is_ipv6()`
error: redundant pattern matching, consider using `is_ipv4()` error: redundant pattern matching, consider using `is_ipv4()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:79:15 --> $DIR/redundant_pattern_matching_ipaddr.rs:85:15
| |
LL | while let V4(_) = V4(Ipv4Addr::LOCALHOST) {} LL | while let V4(_) = V4(Ipv4Addr::LOCALHOST) {}
| ----------^^^^^-------------------------- help: try: `while V4(Ipv4Addr::LOCALHOST).is_ipv4()` | ----------^^^^^-------------------------- help: try: `while V4(Ipv4Addr::LOCALHOST).is_ipv4()`
error: redundant pattern matching, consider using `is_ipv6()` error: redundant pattern matching, consider using `is_ipv6()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:81:15 --> $DIR/redundant_pattern_matching_ipaddr.rs:87:15
| |
LL | while let V6(_) = V6(Ipv6Addr::LOCALHOST) {} LL | while let V6(_) = V6(Ipv6Addr::LOCALHOST) {}
| ----------^^^^^-------------------------- help: try: `while V6(Ipv6Addr::LOCALHOST).is_ipv6()` | ----------^^^^^-------------------------- help: try: `while V6(Ipv6Addr::LOCALHOST).is_ipv6()`
error: redundant pattern matching, consider using `is_ipv4()` error: redundant pattern matching, consider using `is_ipv4()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:83:5 --> $DIR/redundant_pattern_matching_ipaddr.rs:89:5
| |
LL | / match V4(Ipv4Addr::LOCALHOST) { LL | / match V4(Ipv4Addr::LOCALHOST) {
LL | | V4(_) => true, LL | | V4(_) => true,
@ -119,7 +131,7 @@ LL | | };
| |_____^ help: try: `V4(Ipv4Addr::LOCALHOST).is_ipv4()` | |_____^ help: try: `V4(Ipv4Addr::LOCALHOST).is_ipv4()`
error: redundant pattern matching, consider using `is_ipv6()` error: redundant pattern matching, consider using `is_ipv6()`
--> $DIR/redundant_pattern_matching_ipaddr.rs:88:5 --> $DIR/redundant_pattern_matching_ipaddr.rs:94:5
| |
LL | / match V6(Ipv6Addr::LOCALHOST) { LL | / match V6(Ipv6Addr::LOCALHOST) {
LL | | V4(_) => false, LL | | V4(_) => false,
@ -127,5 +139,5 @@ LL | | V6(_) => true,
LL | | }; LL | | };
| |_____^ help: try: `V6(Ipv6Addr::LOCALHOST).is_ipv6()` | |_____^ help: try: `V6(Ipv6Addr::LOCALHOST).is_ipv6()`
error: aborting due to 18 previous errors error: aborting due to 20 previous errors

View File

@ -22,6 +22,12 @@ fn main() {
bar(); bar();
} }
// Issue 6459
if Ready(42).is_ready() {}
// Issue 6459
if Pending::<()>.is_pending() {}
while Ready(42).is_ready() {} while Ready(42).is_ready() {}
while Ready(42).is_pending() {} while Ready(42).is_pending() {}

View File

@ -22,6 +22,12 @@ fn main() {
bar(); bar();
} }
// Issue 6459
if matches!(Ready(42), Ready(_)) {}
// Issue 6459
if matches!(Pending::<()>, Pending) {}
while let Ready(_) = Ready(42) {} while let Ready(_) = Ready(42) {}
while let Pending = Ready(42) {} while let Pending = Ready(42) {}

View File

@ -20,25 +20,37 @@ LL | if let Ready(_) = Ready(42) {
| -------^^^^^^^^------------ help: try: `if Ready(42).is_ready()` | -------^^^^^^^^------------ help: try: `if Ready(42).is_ready()`
error: redundant pattern matching, consider using `is_ready()` error: redundant pattern matching, consider using `is_ready()`
--> $DIR/redundant_pattern_matching_poll.rs:25:15 --> $DIR/redundant_pattern_matching_poll.rs:26:8
|
LL | if matches!(Ready(42), Ready(_)) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Ready(42).is_ready()`
error: redundant pattern matching, consider using `is_pending()`
--> $DIR/redundant_pattern_matching_poll.rs:29:8
|
LL | if matches!(Pending::<()>, Pending) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Pending::<()>.is_pending()`
error: redundant pattern matching, consider using `is_ready()`
--> $DIR/redundant_pattern_matching_poll.rs:31:15
| |
LL | while let Ready(_) = Ready(42) {} LL | while let Ready(_) = Ready(42) {}
| ----------^^^^^^^^------------ help: try: `while Ready(42).is_ready()` | ----------^^^^^^^^------------ help: try: `while Ready(42).is_ready()`
error: redundant pattern matching, consider using `is_pending()` error: redundant pattern matching, consider using `is_pending()`
--> $DIR/redundant_pattern_matching_poll.rs:27:15 --> $DIR/redundant_pattern_matching_poll.rs:33:15
| |
LL | while let Pending = Ready(42) {} LL | while let Pending = Ready(42) {}
| ----------^^^^^^^------------ help: try: `while Ready(42).is_pending()` | ----------^^^^^^^------------ help: try: `while Ready(42).is_pending()`
error: redundant pattern matching, consider using `is_pending()` error: redundant pattern matching, consider using `is_pending()`
--> $DIR/redundant_pattern_matching_poll.rs:29:15 --> $DIR/redundant_pattern_matching_poll.rs:35:15
| |
LL | while let Pending = Pending::<()> {} LL | while let Pending = Pending::<()> {}
| ----------^^^^^^^---------------- help: try: `while Pending::<()>.is_pending()` | ----------^^^^^^^---------------- help: try: `while Pending::<()>.is_pending()`
error: redundant pattern matching, consider using `is_ready()` error: redundant pattern matching, consider using `is_ready()`
--> $DIR/redundant_pattern_matching_poll.rs:35:5 --> $DIR/redundant_pattern_matching_poll.rs:41:5
| |
LL | / match Ready(42) { LL | / match Ready(42) {
LL | | Ready(_) => true, LL | | Ready(_) => true,
@ -47,7 +59,7 @@ LL | | };
| |_____^ help: try: `Ready(42).is_ready()` | |_____^ help: try: `Ready(42).is_ready()`
error: redundant pattern matching, consider using `is_pending()` error: redundant pattern matching, consider using `is_pending()`
--> $DIR/redundant_pattern_matching_poll.rs:40:5 --> $DIR/redundant_pattern_matching_poll.rs:46:5
| |
LL | / match Pending::<()> { LL | / match Pending::<()> {
LL | | Ready(_) => false, LL | | Ready(_) => false,
@ -56,7 +68,7 @@ LL | | };
| |_____^ help: try: `Pending::<()>.is_pending()` | |_____^ help: try: `Pending::<()>.is_pending()`
error: redundant pattern matching, consider using `is_pending()` error: redundant pattern matching, consider using `is_pending()`
--> $DIR/redundant_pattern_matching_poll.rs:45:13 --> $DIR/redundant_pattern_matching_poll.rs:51:13
| |
LL | let _ = match Pending::<()> { LL | let _ = match Pending::<()> {
| _____________^ | _____________^
@ -66,49 +78,49 @@ LL | | };
| |_____^ help: try: `Pending::<()>.is_pending()` | |_____^ help: try: `Pending::<()>.is_pending()`
error: redundant pattern matching, consider using `is_ready()` error: redundant pattern matching, consider using `is_ready()`
--> $DIR/redundant_pattern_matching_poll.rs:51:20 --> $DIR/redundant_pattern_matching_poll.rs:57:20
| |
LL | let _ = if let Ready(_) = poll { true } else { false }; LL | let _ = if let Ready(_) = poll { true } else { false };
| -------^^^^^^^^------- help: try: `if poll.is_ready()` | -------^^^^^^^^------- help: try: `if poll.is_ready()`
error: redundant pattern matching, consider using `is_ready()` error: redundant pattern matching, consider using `is_ready()`
--> $DIR/redundant_pattern_matching_poll.rs:55:20 --> $DIR/redundant_pattern_matching_poll.rs:61:20
| |
LL | let _ = if let Ready(_) = gen_poll() { LL | let _ = if let Ready(_) = gen_poll() {
| -------^^^^^^^^------------- help: try: `if gen_poll().is_ready()` | -------^^^^^^^^------------- help: try: `if gen_poll().is_ready()`
error: redundant pattern matching, consider using `is_pending()` error: redundant pattern matching, consider using `is_pending()`
--> $DIR/redundant_pattern_matching_poll.rs:57:19 --> $DIR/redundant_pattern_matching_poll.rs:63:19
| |
LL | } else if let Pending = gen_poll() { LL | } else if let Pending = gen_poll() {
| -------^^^^^^^------------- help: try: `if gen_poll().is_pending()` | -------^^^^^^^------------- help: try: `if gen_poll().is_pending()`
error: redundant pattern matching, consider using `is_ready()` error: redundant pattern matching, consider using `is_ready()`
--> $DIR/redundant_pattern_matching_poll.rs:73:12 --> $DIR/redundant_pattern_matching_poll.rs:79:12
| |
LL | if let Ready(_) = Ready(42) {} LL | if let Ready(_) = Ready(42) {}
| -------^^^^^^^^------------ help: try: `if Ready(42).is_ready()` | -------^^^^^^^^------------ help: try: `if Ready(42).is_ready()`
error: redundant pattern matching, consider using `is_pending()` error: redundant pattern matching, consider using `is_pending()`
--> $DIR/redundant_pattern_matching_poll.rs:75:12 --> $DIR/redundant_pattern_matching_poll.rs:81:12
| |
LL | if let Pending = Pending::<()> {} LL | if let Pending = Pending::<()> {}
| -------^^^^^^^---------------- help: try: `if Pending::<()>.is_pending()` | -------^^^^^^^---------------- help: try: `if Pending::<()>.is_pending()`
error: redundant pattern matching, consider using `is_ready()` error: redundant pattern matching, consider using `is_ready()`
--> $DIR/redundant_pattern_matching_poll.rs:77:15 --> $DIR/redundant_pattern_matching_poll.rs:83:15
| |
LL | while let Ready(_) = Ready(42) {} LL | while let Ready(_) = Ready(42) {}
| ----------^^^^^^^^------------ help: try: `while Ready(42).is_ready()` | ----------^^^^^^^^------------ help: try: `while Ready(42).is_ready()`
error: redundant pattern matching, consider using `is_pending()` error: redundant pattern matching, consider using `is_pending()`
--> $DIR/redundant_pattern_matching_poll.rs:79:15 --> $DIR/redundant_pattern_matching_poll.rs:85:15
| |
LL | while let Pending = Pending::<()> {} LL | while let Pending = Pending::<()> {}
| ----------^^^^^^^---------------- help: try: `while Pending::<()>.is_pending()` | ----------^^^^^^^---------------- help: try: `while Pending::<()>.is_pending()`
error: redundant pattern matching, consider using `is_ready()` error: redundant pattern matching, consider using `is_ready()`
--> $DIR/redundant_pattern_matching_poll.rs:81:5 --> $DIR/redundant_pattern_matching_poll.rs:87:5
| |
LL | / match Ready(42) { LL | / match Ready(42) {
LL | | Ready(_) => true, LL | | Ready(_) => true,
@ -117,7 +129,7 @@ LL | | };
| |_____^ help: try: `Ready(42).is_ready()` | |_____^ help: try: `Ready(42).is_ready()`
error: redundant pattern matching, consider using `is_pending()` error: redundant pattern matching, consider using `is_pending()`
--> $DIR/redundant_pattern_matching_poll.rs:86:5 --> $DIR/redundant_pattern_matching_poll.rs:92:5
| |
LL | / match Pending::<()> { LL | / match Pending::<()> {
LL | | Ready(_) => false, LL | | Ready(_) => false,
@ -125,5 +137,5 @@ LL | | Pending => true,
LL | | }; LL | | };
| |_____^ help: try: `Pending::<()>.is_pending()` | |_____^ help: try: `Pending::<()>.is_pending()`
error: aborting due to 18 previous errors error: aborting due to 20 previous errors