From c3a998e82a50b66e8f6f97170cd9117fadf03618 Mon Sep 17 00:00:00 2001 From: Esteban Kuber Date: Tue, 8 Mar 2022 17:20:05 +0000 Subject: [PATCH] Do not suggest `let_else` if no bindings would be introduced --- .../src/thir/pattern/check_match.rs | 2 +- .../ui/consts/const-match-check.eval1.stderr | 4 ---- .../ui/consts/const-match-check.eval2.stderr | 4 ---- .../ui/consts/const-match-check.matchck.stderr | 16 ---------------- ...e-been-expanded-earlier-non-exhaustive.stderr | 4 ---- .../non-exhaustive-defined-here.stderr | 12 ------------ .../usefulness/refutable-pattern-errors.stderr | 4 ---- 7 files changed, 1 insertion(+), 45 deletions(-) diff --git a/compiler/rustc_mir_build/src/thir/pattern/check_match.rs b/compiler/rustc_mir_build/src/thir/pattern/check_match.rs index dae313da8d993..c94da838680e0 100644 --- a/compiler/rustc_mir_build/src/thir/pattern/check_match.rs +++ b/compiler/rustc_mir_build/src/thir/pattern/check_match.rs @@ -330,7 +330,7 @@ impl<'p, 'tcx> MatchVisitor<'_, 'p, 'tcx> { ], Applicability::HasPlaceholders, ); - if cx.tcx.sess.is_nightly_build() { + if !bindings.is_empty() && cx.tcx.sess.is_nightly_build() { err.span_suggestion_verbose( semi_span.shrink_to_lo(), &format!( diff --git a/src/test/ui/consts/const-match-check.eval1.stderr b/src/test/ui/consts/const-match-check.eval1.stderr index 08ee800f138d2..6e61dbbd8eee3 100644 --- a/src/test/ui/consts/const-match-check.eval1.stderr +++ b/src/test/ui/consts/const-match-check.eval1.stderr @@ -11,10 +11,6 @@ help: you might want to use `if let` to ignore the variants that aren't matched | LL | A = { if let 0 = 0 { todo!() } 0 }, | ++ ~~~~~~~~~~~ -help: alternatively, on nightly, you might want to use `#![feature(let_else)]` to handle the variants that aren't matched - | -LL | A = { let 0 = 0 else { todo!() }; 0 }, - | ++++++++++++++++ error: aborting due to previous error diff --git a/src/test/ui/consts/const-match-check.eval2.stderr b/src/test/ui/consts/const-match-check.eval2.stderr index 579cb7e780007..1b3b6e06c3df6 100644 --- a/src/test/ui/consts/const-match-check.eval2.stderr +++ b/src/test/ui/consts/const-match-check.eval2.stderr @@ -11,10 +11,6 @@ help: you might want to use `if let` to ignore the variants that aren't matched | LL | let x: [i32; { if let 0 = 0 { todo!() } 0 }] = []; | ++ ~~~~~~~~~~~ -help: alternatively, on nightly, you might want to use `#![feature(let_else)]` to handle the variants that aren't matched - | -LL | let x: [i32; { let 0 = 0 else { todo!() }; 0 }] = []; - | ++++++++++++++++ error: aborting due to previous error diff --git a/src/test/ui/consts/const-match-check.matchck.stderr b/src/test/ui/consts/const-match-check.matchck.stderr index f89bbc0d42234..bc8edfa7af9f4 100644 --- a/src/test/ui/consts/const-match-check.matchck.stderr +++ b/src/test/ui/consts/const-match-check.matchck.stderr @@ -11,10 +11,6 @@ help: you might want to use `if let` to ignore the variants that aren't matched | LL | const X: i32 = { if let 0 = 0 { todo!() } 0 }; | ++ ~~~~~~~~~~~ -help: alternatively, on nightly, you might want to use `#![feature(let_else)]` to handle the variants that aren't matched - | -LL | const X: i32 = { let 0 = 0 else { todo!() }; 0 }; - | ++++++++++++++++ error[E0005]: refutable pattern in local binding: `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered --> $DIR/const-match-check.rs:8:23 @@ -29,10 +25,6 @@ help: you might want to use `if let` to ignore the variants that aren't matched | LL | static Y: i32 = { if let 0 = 0 { todo!() } 0 }; | ++ ~~~~~~~~~~~ -help: alternatively, on nightly, you might want to use `#![feature(let_else)]` to handle the variants that aren't matched - | -LL | static Y: i32 = { let 0 = 0 else { todo!() }; 0 }; - | ++++++++++++++++ error[E0005]: refutable pattern in local binding: `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered --> $DIR/const-match-check.rs:13:26 @@ -47,10 +39,6 @@ help: you might want to use `if let` to ignore the variants that aren't matched | LL | const X: i32 = { if let 0 = 0 { todo!() } 0 }; | ++ ~~~~~~~~~~~ -help: alternatively, on nightly, you might want to use `#![feature(let_else)]` to handle the variants that aren't matched - | -LL | const X: i32 = { let 0 = 0 else { todo!() }; 0 }; - | ++++++++++++++++ error[E0005]: refutable pattern in local binding: `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered --> $DIR/const-match-check.rs:19:26 @@ -65,10 +53,6 @@ help: you might want to use `if let` to ignore the variants that aren't matched | LL | const X: i32 = { if let 0 = 0 { todo!() } 0 }; | ++ ~~~~~~~~~~~ -help: alternatively, on nightly, you might want to use `#![feature(let_else)]` to handle the variants that aren't matched - | -LL | const X: i32 = { let 0 = 0 else { todo!() }; 0 }; - | ++++++++++++++++ error: aborting due to 4 previous errors diff --git a/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr b/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr index aa1aa4434c3fa..95b22ac059482 100644 --- a/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr +++ b/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr @@ -11,10 +11,6 @@ help: you might want to use `if let` to ignore the variants that aren't matched | LL | if let (0 | (1 | 2)) = 0 { todo!() } | ++ ~~~~~~~~~~~ -help: alternatively, on nightly, you might want to use `#![feature(let_else)]` to handle the variants that aren't matched - | -LL | let (0 | (1 | 2)) = 0 else { todo!() }; - | ++++++++++++++++ error[E0004]: non-exhaustive patterns: `i32::MIN..=-1_i32` and `3_i32..=i32::MAX` not covered --> $DIR/issue-69875-should-have-been-expanded-earlier-non-exhaustive.rs:3:11 diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-defined-here.stderr b/src/test/ui/pattern/usefulness/non-exhaustive-defined-here.stderr index f7dc070f80248..0f06c31c468b1 100644 --- a/src/test/ui/pattern/usefulness/non-exhaustive-defined-here.stderr +++ b/src/test/ui/pattern/usefulness/non-exhaustive-defined-here.stderr @@ -46,10 +46,6 @@ help: you might want to use `if let` to ignore the variants that aren't matched | LL | if let E::A = e { todo!() } | ++ ~~~~~~~~~~~ -help: alternatively, on nightly, you might want to use `#![feature(let_else)]` to handle the variants that aren't matched - | -LL | let E::A = e else { todo!() }; - | ++++++++++++++++ error[E0004]: non-exhaustive patterns: `&B` and `&C` not covered --> $DIR/non-exhaustive-defined-here.rs:52:11 @@ -99,10 +95,6 @@ help: you might want to use `if let` to ignore the variants that aren't matched | LL | if let E::A = e { todo!() } | ++ ~~~~~~~~~~~ -help: alternatively, on nightly, you might want to use `#![feature(let_else)]` to handle the variants that aren't matched - | -LL | let E::A = e else { todo!() }; - | ++++++++++++++++ error[E0004]: non-exhaustive patterns: `&&mut &B` and `&&mut &C` not covered --> $DIR/non-exhaustive-defined-here.rs:66:11 @@ -152,10 +144,6 @@ help: you might want to use `if let` to ignore the variants that aren't matched | LL | if let E::A = e { todo!() } | ++ ~~~~~~~~~~~ -help: alternatively, on nightly, you might want to use `#![feature(let_else)]` to handle the variants that aren't matched - | -LL | let E::A = e else { todo!() }; - | ++++++++++++++++ error[E0004]: non-exhaustive patterns: `None` not covered --> $DIR/non-exhaustive-defined-here.rs:92:11 diff --git a/src/test/ui/pattern/usefulness/refutable-pattern-errors.stderr b/src/test/ui/pattern/usefulness/refutable-pattern-errors.stderr index e3ffc092327ac..d1dacc822e942 100644 --- a/src/test/ui/pattern/usefulness/refutable-pattern-errors.stderr +++ b/src/test/ui/pattern/usefulness/refutable-pattern-errors.stderr @@ -19,10 +19,6 @@ help: you might want to use `if let` to ignore the variants that aren't matched | LL | if let (1, (Some(1), 2..=3)) = (1, (None, 2)) { todo!() } | ++ ~~~~~~~~~~~ -help: alternatively, on nightly, you might want to use `#![feature(let_else)]` to handle the variants that aren't matched - | -LL | let (1, (Some(1), 2..=3)) = (1, (None, 2)) else { todo!() }; - | ++++++++++++++++ error: aborting due to 2 previous errors