diff --git a/compiler/rustc_error_messages/locales/en-US/mir_build.ftl b/compiler/rustc_error_messages/locales/en-US/mir_build.ftl index f9bda721df34d..4d97e75ebbd6d 100644 --- a/compiler/rustc_error_messages/locales/en-US/mir_build.ftl +++ b/compiler/rustc_error_messages/locales/en-US/mir_build.ftl @@ -192,9 +192,15 @@ mir_build_const_param_in_pattern = const parameters cannot be referenced in patt mir_build_non_const_path = runtime values cannot be referenced in patterns -mir_build_unreachable_pattern = unreachable pattern - .label = unreachable pattern - .catchall_label = matches any value +mir_build_unreachable_patterns = {$count -> + [one] unreachable pattern + *[more] multiple unreachable patterns + } + .catchall_label = this pattern is irrefutable; subsequent arms are never executed + +mir_build_never_executed = this arm is never executed + +mir_build_unreachable_pattern = this pattern is unreachable mir_build_const_pattern_depends_on_generic_parameter = constant pattern depends on a generic parameter diff --git a/compiler/rustc_middle/src/lint.rs b/compiler/rustc_middle/src/lint.rs index c61de97d53271..1d49813c12cab 100644 --- a/compiler/rustc_middle/src/lint.rs +++ b/compiler/rustc_middle/src/lint.rs @@ -298,6 +298,7 @@ pub fn explain_lint_level_source( /// // ^^^^^^^^^^^^^^^^^^^^^ returns `&mut DiagnosticBuilder` by default /// ) /// ``` +#[track_caller] pub fn struct_lint_level( sess: &Session, lint: &'static Lint, @@ -311,6 +312,7 @@ pub fn struct_lint_level( ) { // Avoid codegen bloat from monomorphization by immediately doing dyn dispatch of `decorate` to // the "real" work. + #[track_caller] fn struct_lint_level_impl( sess: &Session, lint: &'static Lint, diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs index a60c55e8af4d2..25665a0b7a874 100644 --- a/compiler/rustc_middle/src/ty/context.rs +++ b/compiler/rustc_middle/src/ty/context.rs @@ -2075,6 +2075,7 @@ impl<'tcx> TyCtxt<'tcx> { /// Emit a lint at `span` from a lint struct (some type that implements `DecorateLint`, /// typically generated by `#[derive(LintDiagnostic)]`). + #[track_caller] pub fn emit_spanned_lint( self, lint: &'static Lint, @@ -2111,6 +2112,7 @@ impl<'tcx> TyCtxt<'tcx> { /// Emit a lint from a lint struct (some type that implements `DecorateLint`, typically /// generated by `#[derive(LintDiagnostic)]`). + #[track_caller] pub fn emit_lint( self, lint: &'static Lint, diff --git a/compiler/rustc_mir_build/src/build/custom/parse.rs b/compiler/rustc_mir_build/src/build/custom/parse.rs index d72770e70c7ec..56a62ebe90649 100644 --- a/compiler/rustc_mir_build/src/build/custom/parse.rs +++ b/compiler/rustc_mir_build/src/build/custom/parse.rs @@ -36,6 +36,7 @@ macro_rules! parse_by_kind { let expr = &$self.thir[expr_id]; debug!("Trying to parse {:?} as {}", expr.kind, $expected); let $expr_name = expr; + #[allow(unreachable_patterns)] match &expr.kind { $( ExprKind::Call { ty, fun: _, args: $args, .. } if { @@ -50,7 +51,6 @@ macro_rules! parse_by_kind { $( $pat => $expr, )* - #[allow(unreachable_patterns)] _ => return Err($self.expr_error(expr_id, $expected)) } }}; diff --git a/compiler/rustc_mir_build/src/errors.rs b/compiler/rustc_mir_build/src/errors.rs index ced251267d36f..178c8a972bd6d 100644 --- a/compiler/rustc_mir_build/src/errors.rs +++ b/compiler/rustc_mir_build/src/errors.rs @@ -465,14 +465,29 @@ pub struct NonConstPath { } #[derive(LintDiagnostic)] -#[diag(mir_build_unreachable_pattern)] -pub struct UnreachablePattern { - #[label] - pub span: Option, +#[diag(mir_build_unreachable_patterns)] +pub struct UnreachablePatterns { + #[subdiagnostic] + pub unreachable_arms: Vec, + pub count: usize, #[label(catchall_label)] pub catchall: Option, } +#[derive(Subdiagnostic)] +pub enum UnreachableArm { + #[label(mir_build_never_executed)] + NeverExecuted { + #[primary_span] + span: Span, + }, + #[label(mir_build_unreachable_pattern)] + PatternUnreachable { + #[primary_span] + span: Span, + }, +} + #[derive(Diagnostic)] #[diag(mir_build_const_pattern_depends_on_generic_parameter)] pub struct ConstPatternDependsOnGenericParameter { 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 2640ca56b00e9..1c8c653bfe7ec 100644 --- a/compiler/rustc_mir_build/src/thir/pattern/check_match.rs +++ b/compiler/rustc_mir_build/src/thir/pattern/check_match.rs @@ -207,10 +207,17 @@ impl<'p, 'tcx> MatchVisitor<'_, 'p, 'tcx> { match source { // Don't report arm reachability of desugared `match $iter.into_iter() { iter => .. }` // when the iterator is an uninhabited type. unreachable_code will trigger instead. - hir::MatchSource::ForLoopDesugar if arms.len() == 1 => {} - hir::MatchSource::ForLoopDesugar - | hir::MatchSource::Normal - | hir::MatchSource::FormatArgs => report_arm_reachability(&cx, &report), + hir::MatchSource::ForLoopDesugar if arms.len() == 1 => {}, + hir::MatchSource::ForLoopDesugar | hir::MatchSource::FormatArgs => { + report_let_reachability(scrut.hir_id, &cx, &report) + }, + hir::MatchSource::Normal => { + if let ty::Adt(def, _) = scrut_ty.kind() && def.is_enum() && def.variants().is_empty() { + report_empty_enum_arms(scrut.hir_id, hir_arms, &cx) + } else { + report_arm_reachability(scrut.hir_id, hir_arms, &cx, &report) + } + } // Unreachable patterns in try and await expressions occur when one of // the arms are an uninhabited type. Which is OK. hir::MatchSource::AwaitDesugar | hir::MatchSource::TryDesugar => {} @@ -520,15 +527,6 @@ fn pat_is_catchall(pat: &DeconstructedPat<'_, '_>) -> bool { } } -fn unreachable_pattern(tcx: TyCtxt<'_>, span: Span, id: HirId, catchall: Option) { - tcx.emit_spanned_lint( - UNREACHABLE_PATTERNS, - id, - span, - UnreachablePattern { span: if catchall.is_some() { Some(span) } else { None }, catchall }, - ); -} - fn irrefutable_let_pattern(tcx: TyCtxt<'_>, id: HirId, span: Span) { let source = let_source(tcx, id); irrefutable_let_patterns(tcx, id, source, 1, span); @@ -561,43 +559,127 @@ fn is_let_irrefutable<'p, 'tcx>( pat_id: HirId, pat: &'p DeconstructedPat<'p, 'tcx>, ) -> bool { - let arms = [MatchArm { pat, hir_id: pat_id, has_guard: false }]; - let report = compute_match_usefulness(&cx, &arms, pat_id, pat.ty()); + let arms = MatchArm { pat, hir_id: pat_id, has_guard: false }; + let report = compute_match_usefulness(&cx, &[arms], pat_id, pat.ty()); // Report if the pattern is unreachable, which can only occur when the type is uninhabited. // This also reports unreachable sub-patterns though, so we can't just replace it with an // `is_uninhabited` check. - report_arm_reachability(&cx, &report); + report_let_reachability(pat_id, &cx, &report); // If the list of witnesses is empty, the match is exhaustive, // i.e. the `if let` pattern is irrefutable. report.non_exhaustiveness_witnesses.is_empty() } +/// Report unreachable let branches, if any. +fn report_let_reachability<'p, 'tcx>( + scrut: HirId, + cx: &MatchCheckCtxt<'p, 'tcx>, + report: &UsefulnessReport<'p, 'tcx>, +) { + let mut unreachable_arms = Vec::new(); + let mut spans = Vec::new(); + + for (arm, is_useful) in &report.arm_usefulness { + match is_useful { + Reachability::Unreachable => { + spans.push(arm.pat.span()); + unreachable_arms.push(UnreachableArm::PatternUnreachable { span: arm.pat.span() }); + } + // The arm is reachable, but contains unreachable subpatterns (from or-patterns). + Reachability::Reachable(unreachables) => { + for &span in unreachables { + spans.push(span); + unreachable_arms.push(UnreachableArm::PatternUnreachable { span }); + } + } + } + } + + if !unreachable_arms.is_empty() { + cx.tcx.emit_spanned_lint( + UNREACHABLE_PATTERNS, + scrut, + spans, + UnreachablePatterns { count: unreachable_arms.len(), unreachable_arms, catchall: None }, + ); + } +} + /// Report unreachable arms, if any. fn report_arm_reachability<'p, 'tcx>( + scrut: HirId, + hir_arms: &'tcx [hir::Arm<'tcx>], cx: &MatchCheckCtxt<'p, 'tcx>, report: &UsefulnessReport<'p, 'tcx>, ) { - use Reachability::*; - let mut catchall = None; - for (arm, is_useful) in report.arm_usefulness.iter() { + let mut unreachable_arms = Vec::new(); + + let mut spans = Vec::new(); + for ((_, is_useful), hir::Arm { span, .. }) in report.arm_usefulness.iter().zip(hir_arms) { match is_useful { - Unreachable => unreachable_pattern(cx.tcx, arm.pat.span(), arm.hir_id, catchall), - Reachable(unreachables) if unreachables.is_empty() => {} + Reachability::Unreachable => { + spans.push(*span); + unreachable_arms.push(UnreachableArm::NeverExecuted { span: *span }); + } // The arm is reachable, but contains unreachable subpatterns (from or-patterns). - Reachable(unreachables) => { - let mut unreachables = unreachables.clone(); - // Emit lints in the order in which they occur in the file. - unreachables.sort_unstable(); - for span in unreachables { - unreachable_pattern(cx.tcx, span, arm.hir_id, None); + Reachability::Reachable(unreachables) => { + for &span in unreachables { + spans.push(span); + unreachable_arms.push(UnreachableArm::PatternUnreachable { span }); } } } - if !arm.has_guard && catchall.is_none() && pat_is_catchall(arm.pat) { - catchall = Some(arm.pat.span()); - } + } + + // Mention it if there's a catch-all arm, but not if it's the last one. + let catchall = if let [arms @ .., _last] = &*report.arm_usefulness { + arms.iter() + .filter_map(|(arm, _)| { + (!arm.has_guard && pat_is_catchall(arm.pat)).then(|| arm.pat.span()) + }) + .next() + } else { + None + }; + if let Some(span) = catchall { + spans.push(span); + } + + if !unreachable_arms.is_empty() { + cx.tcx.emit_spanned_lint( + UNREACHABLE_PATTERNS, + scrut, + spans, + UnreachablePatterns { count: unreachable_arms.len(), unreachable_arms, catchall }, + ); + } +} + +/// Report every arm matching on , if any. +fn report_empty_enum_arms<'p, 'tcx>( + scrut: HirId, + hir_arms: &'tcx [hir::Arm<'tcx>], + cx: &MatchCheckCtxt<'p, 'tcx>, +) { + let mut spans = Vec::new(); + + let unreachable_arms = hir_arms + .iter() + .map(|arm| { + spans.push(arm.span); + UnreachableArm::NeverExecuted { span: arm.span } + }) + .collect::>(); + + if !unreachable_arms.is_empty() { + cx.tcx.emit_spanned_lint( + UNREACHABLE_PATTERNS, + scrut, + spans, + UnreachablePatterns { count: unreachable_arms.len(), unreachable_arms, catchall: None }, + ); } } diff --git a/tests/ui/consts/const_in_pattern/issue-78057.stderr b/tests/ui/consts/const_in_pattern/issue-78057.stderr index 35619594f75b8..351f4cfdf9bf1 100644 --- a/tests/ui/consts/const_in_pattern/issue-78057.stderr +++ b/tests/ui/consts/const_in_pattern/issue-78057.stderr @@ -5,13 +5,13 @@ LL | FOO => {}, | ^^^ error: unreachable pattern - --> $DIR/issue-78057.rs:14:9 + --> $DIR/issue-78057.rs:12:9 | LL | FOO => {}, - | --- matches any value + | ^^^ this pattern is irrefutable; subsequent arms are never executed LL | LL | _ => {} - | ^ unreachable pattern + | ^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/issue-78057.rs:1:9 diff --git a/tests/ui/consts/packed_pattern.stderr b/tests/ui/consts/packed_pattern.stderr index 9ca50a95e4e41..ec5b7c94c76b0 100644 --- a/tests/ui/consts/packed_pattern.stderr +++ b/tests/ui/consts/packed_pattern.stderr @@ -2,7 +2,7 @@ warning: unreachable pattern --> $DIR/packed_pattern.rs:16:9 | LL | FOO => unreachable!(), - | ^^^ + | ^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | = note: `#[warn(unreachable_patterns)]` on by default diff --git a/tests/ui/consts/packed_pattern2.stderr b/tests/ui/consts/packed_pattern2.stderr index 4dc54461eeb24..be7d6990f4297 100644 --- a/tests/ui/consts/packed_pattern2.stderr +++ b/tests/ui/consts/packed_pattern2.stderr @@ -2,7 +2,7 @@ warning: unreachable pattern --> $DIR/packed_pattern2.rs:24:9 | LL | FOO => unreachable!(), - | ^^^ + | ^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | = note: `#[warn(unreachable_patterns)]` on by default diff --git a/tests/ui/error-codes/E0001.stderr b/tests/ui/error-codes/E0001.stderr index 577c49032d799..57a065ba911c5 100644 --- a/tests/ui/error-codes/E0001.stderr +++ b/tests/ui/error-codes/E0001.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/E0001.rs:8:9 | LL | _ => {/* ... */} - | ^ + | ^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/E0001.rs:1:9 diff --git a/tests/ui/lint/issue-30302.stderr b/tests/ui/lint/issue-30302.stderr index baf6c0d7a59d8..ddd010f08715e 100644 --- a/tests/ui/lint/issue-30302.stderr +++ b/tests/ui/lint/issue-30302.stderr @@ -7,13 +7,13 @@ LL | Nil => true, = note: `#[deny(bindings_with_variant_name)]` on by default error: unreachable pattern - --> $DIR/issue-30302.rs:15:9 + --> $DIR/issue-30302.rs:13:9 | LL | Nil => true, - | --- matches any value + | ^^^ this pattern is irrefutable; subsequent arms are never executed LL | LL | _ => false - | ^ unreachable pattern + | ^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/issue-30302.rs:4:9 diff --git a/tests/ui/or-patterns/exhaustiveness-unreachable-pattern.rs b/tests/ui/or-patterns/exhaustiveness-unreachable-pattern.rs index 8429799cabf15..d584db78946e9 100644 --- a/tests/ui/or-patterns/exhaustiveness-unreachable-pattern.rs +++ b/tests/ui/or-patterns/exhaustiveness-unreachable-pattern.rs @@ -4,28 +4,40 @@ fn main() { match (0u8,) { (1 | 2,) => {} - (1,) => {} //~ ERROR unreachable pattern + (1,) => {} + //~^ ERROR unreachable pattern + //~| this arm is never executed _ => {} } match (0u8,) { (1 | 2,) => {} - (2,) => {} //~ ERROR unreachable pattern + (2,) => {} + //~^ ERROR unreachable pattern + //~| this arm is never executed _ => {} } match (0u8,) { (1,) => {} (2,) => {} - (1 | 2,) => {} //~ ERROR unreachable pattern + (1 | 2,) => {} + //~^ ERROR unreachable pattern + //~| this arm is never executed _ => {} } match (0u8, 0u8) { (1 | 2, 3 | 4) => {} - (1, 3) => {} //~ ERROR unreachable pattern - (1, 4) => {} //~ ERROR unreachable pattern - (2, 4) => {} //~ ERROR unreachable pattern - (2 | 1, 4) => {} //~ ERROR unreachable pattern + (1, 3) => {} + //~^ ERROR multiple unreachable patterns + //~| this arm is never executed + (1, 4) => {} + //~^ this arm is never executed + (2, 4) => {} + //~^ this arm is never executed + (2 | 1, 4) => {} + //~^ this arm is never executed (1, 5 | 6) => {} - (1, 4 | 5) => {} //~ ERROR unreachable pattern + (1, 4 | 5) => {} + //~^ this arm is never executed _ => {} } match (true, true) { @@ -33,44 +45,59 @@ fn main() { } match (Some(0u8),) { (None | Some(1 | 2),) => {} - (Some(1),) => {} //~ ERROR unreachable pattern - (None,) => {} //~ ERROR unreachable pattern + (Some(1),) => {} + //~^ ERROR multiple unreachable patterns + //~| this arm is never executed + (None,) => {} + //~^ this arm is never executed _ => {} } match ((0u8,),) { ((1 | 2,) | (3 | 4,),) => {} - ((1..=4,),) => {} //~ ERROR unreachable pattern + ((1..=4,),) => {} + //~^ ERROR unreachable pattern + //~| this arm is never executed _ => {} } match (0,) { - (1 | 1,) => {} //~ ERROR unreachable + (1 | 1,) => {} + //~^ ERROR unreachable pattern + //~| this pattern is unreachable _ => {} } match 0 { - (0 | 1) | 1 => {} //~ ERROR unreachable + (0 | 1) | 1 => {} + //~^ ERROR unreachable pattern + //~| this pattern is unreachable _ => {} } match 0 { // We get two errors because recursive or-pattern expansion means we don't notice the two // errors span a whole pattern. This could be better but doesn't matter much 0 | (0 | 0) => {} - //~^ ERROR unreachable - //~| ERROR unreachable + //~^ ERROR multiple unreachable patterns + //~| this pattern is unreachable _ => {} } match None { // There is only one error that correctly points to the whole subpattern Some(0) | - Some( //~ ERROR unreachable + Some( + //~^ ERROR: unreachable pattern + //~| this pattern is unreachable 0 | 0) => {} + _ => {} } match [0; 2] { [0 - | 0 //~ ERROR unreachable + | 0 + //~^ ERROR multiple unreachable patterns + //~| this pattern is unreachable , 0 - | 0] => {} //~ ERROR unreachable + | 0] => {} + //~^ this pattern is unreachable _ => {} } match &[][..] { @@ -78,7 +105,9 @@ fn main() { [0, _] => {} [0, _, _] => {} [1, ..] => {} - [1 //~ ERROR unreachable + [1 + //~^ ERROR unreachable pattern + //~| this pattern is unreachable | 2, ..] => {} _ => {} } @@ -90,19 +119,25 @@ fn main() { match &[][..] { [false] => {} [true, ..] => {} - [true //~ ERROR unreachable + [true + //~^ ERROR unreachable pattern + //~| this pattern is unreachable | false, ..] => {} _ => {} } match (true, None) { (true, Some(_)) => {} (false, Some(true)) => {} - (true | false, None | Some(true //~ ERROR unreachable + (true | false, None | Some(true + //~^ ERROR unreachable pattern + //~| this pattern is unreachable | false)) => {} } macro_rules! t_or_f { () => { - (true //~ ERROR unreachable + (true + //~^ ERROR unreachable pattern + //~| this pattern is unreachable | false) }; } @@ -113,7 +148,9 @@ fn main() { } match Some(0) { Some(0) => {} - Some(0 //~ ERROR unreachable + Some(0 + //~^ ERROR unreachable pattern + //~| this pattern is unreachable | 1) => {} _ => {} } @@ -131,8 +168,8 @@ fn main() { // https://github.com/rust-lang/rust/issues/76836 match None { Some(false) => {} - None | Some(true - | false) => {} //~ ERROR unreachable + None | Some(true | + false) => {} //~ ERROR unreachable } // A subpattern that is unreachable in all branches is overall unreachable. @@ -140,13 +177,19 @@ fn main() { (false, true) => {} (true, true) => {} (false | true, false - | true) => {} //~ ERROR unreachable + | true) => {} + //~^ ERROR unreachable pattern + //~| this pattern is unreachable } match (true, true) { (true, false) => {} (true, true) => {} - (false - | true, //~ ERROR unreachable - false | true) => {} + ( + false + | true, + //~^ ERROR unreachable pattern + //~| this pattern is unreachable + false | true, + ) => {} } } diff --git a/tests/ui/or-patterns/exhaustiveness-unreachable-pattern.stderr b/tests/ui/or-patterns/exhaustiveness-unreachable-pattern.stderr index 3f7d47dcb8ceb..ea40dfc654c9e 100644 --- a/tests/ui/or-patterns/exhaustiveness-unreachable-pattern.stderr +++ b/tests/ui/or-patterns/exhaustiveness-unreachable-pattern.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/exhaustiveness-unreachable-pattern.rs:7:9 | LL | (1,) => {} - | ^^^^ + | ^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/exhaustiveness-unreachable-pattern.rs:1:9 @@ -11,131 +11,111 @@ LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:12:9 + --> $DIR/exhaustiveness-unreachable-pattern.rs:14:9 | LL | (2,) => {} - | ^^^^ + | ^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:18:9 + --> $DIR/exhaustiveness-unreachable-pattern.rs:22:9 | LL | (1 | 2,) => {} - | ^^^^^^^^ + | ^^^^^^^^^^^^^^ this arm is never executed -error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:23:9 +error: multiple unreachable patterns + --> $DIR/exhaustiveness-unreachable-pattern.rs:29:9 | LL | (1, 3) => {} - | ^^^^^^ - -error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:24:9 - | + | ^^^^^^^^^^^^ this arm is never executed +... LL | (1, 4) => {} - | ^^^^^^ - -error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:25:9 - | + | ^^^^^^^^^^^^ this arm is never executed +LL | LL | (2, 4) => {} - | ^^^^^^ - -error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:26:9 - | + | ^^^^^^^^^^^^ this arm is never executed +LL | LL | (2 | 1, 4) => {} - | ^^^^^^^^^^ - -error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:28:9 - | + | ^^^^^^^^^^^^^^^^ this arm is never executed +... LL | (1, 4 | 5) => {} - | ^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^ this arm is never executed -error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:36:9 +error: multiple unreachable patterns + --> $DIR/exhaustiveness-unreachable-pattern.rs:48:9 | LL | (Some(1),) => {} - | ^^^^^^^^^^ - -error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:37:9 - | + | ^^^^^^^^^^^^^^^^ this arm is never executed +... LL | (None,) => {} - | ^^^^^^^ + | ^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:42:9 + --> $DIR/exhaustiveness-unreachable-pattern.rs:57:9 | LL | ((1..=4,),) => {} - | ^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:47:14 + --> $DIR/exhaustiveness-unreachable-pattern.rs:64:14 | LL | (1 | 1,) => {} - | ^ + | ^ this pattern is unreachable error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:51:19 + --> $DIR/exhaustiveness-unreachable-pattern.rs:70:19 | LL | (0 | 1) | 1 => {} - | ^ + | ^ this pattern is unreachable -error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:57:14 +error: multiple unreachable patterns + --> $DIR/exhaustiveness-unreachable-pattern.rs:78:14 | LL | 0 | (0 | 0) => {} - | ^ + | ^ ^ this pattern is unreachable + | | + | this pattern is unreachable error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:57:18 - | -LL | 0 | (0 | 0) => {} - | ^ - -error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:65:13 + --> $DIR/exhaustiveness-unreachable-pattern.rs:86:13 | LL | / Some( +LL | | +LL | | LL | | 0 | 0) => {} - | |______________________^ + | |______________________^ this pattern is unreachable -error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:71:15 +error: multiple unreachable patterns + --> $DIR/exhaustiveness-unreachable-pattern.rs:95:15 | LL | | 0 - | ^ - -error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:73:15 - | + | ^ this pattern is unreachable +... LL | | 0] => {} - | ^ + | ^ this pattern is unreachable error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:81:10 + --> $DIR/exhaustiveness-unreachable-pattern.rs:108:10 | LL | [1 - | ^ + | ^ this pattern is unreachable error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:93:10 + --> $DIR/exhaustiveness-unreachable-pattern.rs:122:10 | LL | [true - | ^^^^ + | ^^^^ this pattern is unreachable error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:100:36 + --> $DIR/exhaustiveness-unreachable-pattern.rs:131:36 | LL | (true | false, None | Some(true - | ^^^^ + | ^^^^ this pattern is unreachable error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:105:14 + --> $DIR/exhaustiveness-unreachable-pattern.rs:138:14 | LL | (true - | ^^^^ + | ^^^^ this pattern is unreachable ... LL | (true | false, None | Some(t_or_f!())) => {} | --------- in this macro invocation @@ -143,28 +123,28 @@ LL | (true | false, None | Some(t_or_f!())) => {} = note: this error originates in the macro `t_or_f` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:116:14 + --> $DIR/exhaustiveness-unreachable-pattern.rs:151:14 | LL | Some(0 - | ^ + | ^ this pattern is unreachable error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:135:19 + --> $DIR/exhaustiveness-unreachable-pattern.rs:172:14 | -LL | | false) => {} - | ^^^^^ +LL | false) => {} + | ^^^^^ this pattern is unreachable error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:143:15 + --> $DIR/exhaustiveness-unreachable-pattern.rs:180:15 | LL | | true) => {} - | ^^^^ + | ^^^^ this pattern is unreachable error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:149:15 + --> $DIR/exhaustiveness-unreachable-pattern.rs:189:15 | LL | | true, - | ^^^^ + | ^^^^ this pattern is unreachable -error: aborting due to 26 previous errors +error: aborting due to 19 previous errors diff --git a/tests/ui/pattern/issue-14221.stderr b/tests/ui/pattern/issue-14221.stderr index 7ea51b5f804c0..7a749cb8d914e 100644 --- a/tests/ui/pattern/issue-14221.stderr +++ b/tests/ui/pattern/issue-14221.stderr @@ -13,13 +13,13 @@ LL | B => "B", | ^ help: to match on the variant, qualify the path: `E::B` error: unreachable pattern - --> $DIR/issue-14221.rs:15:13 + --> $DIR/issue-14221.rs:13:13 | LL | A => "A", - | - matches any value + | ^ this pattern is irrefutable; subsequent arms are never executed LL | LL | B => "B", - | ^ unreachable pattern + | ^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/issue-14221.rs:1:9 diff --git a/tests/ui/pattern/multiline_arm_span.rs b/tests/ui/pattern/multiline_arm_span.rs new file mode 100644 index 0000000000000..eb711eecec2e4 --- /dev/null +++ b/tests/ui/pattern/multiline_arm_span.rs @@ -0,0 +1,16 @@ +#![deny(unreachable_patterns)] + +fn main(){ + let x = 42; + match x{ + 73 => {} + irrefutable => {} + //~^ this pattern is irrefutable; subsequent arms are never executed + other_irrefutable => { + //~^ ERROR unreachable pattern + //~| this arm is never executed + // a big and beautiful multi line match arm + todo!() + } + } +} diff --git a/tests/ui/pattern/multiline_arm_span.stderr b/tests/ui/pattern/multiline_arm_span.stderr new file mode 100644 index 0000000000000..7b1b3220dc488 --- /dev/null +++ b/tests/ui/pattern/multiline_arm_span.stderr @@ -0,0 +1,22 @@ +error: unreachable pattern + --> $DIR/multiline_arm_span.rs:7:9 + | +LL | irrefutable => {} + | ^^^^^^^^^^^ this pattern is irrefutable; subsequent arms are never executed +LL | +LL | / other_irrefutable => { +LL | | +LL | | +LL | | // a big and beautiful multi line match arm +LL | | todo!() +LL | | } + | |_________^ this arm is never executed + | +note: the lint level is defined here + --> $DIR/multiline_arm_span.rs:1:9 + | +LL | #![deny(unreachable_patterns)] + | ^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/tests/ui/pattern/usefulness/consts-opaque.rs b/tests/ui/pattern/usefulness/consts-opaque.rs index ca4fcd85bb6df..2d5fb61996ebf 100644 --- a/tests/ui/pattern/usefulness/consts-opaque.rs +++ b/tests/ui/pattern/usefulness/consts-opaque.rs @@ -31,6 +31,7 @@ fn main() { //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` _ => {} // should not be emitting unreachable warning //~^ ERROR unreachable pattern + //~| this arm is never executed } match FOO_REF { @@ -52,18 +53,19 @@ fn main() { Bar => {} BAR => {} // should not be emitting unreachable warning //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` - //~| ERROR unreachable pattern + //~| ERROR multiple unreachable patterns _ => {} - //~^ ERROR unreachable pattern + //~^ this arm is never executed } match BAR { BAR => {} //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` Bar => {} // should not be emitting unreachable warning - //~^ ERROR unreachable pattern + //~^ ERROR multiple unreachable patterns + //~| this arm is never executed _ => {} - //~^ ERROR unreachable pattern + //~^ this arm is never executed } match BAR { @@ -71,18 +73,19 @@ fn main() { //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` BAR => {} // should not be emitting unreachable warning //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` - //~| ERROR unreachable pattern + //~| ERROR multiple unreachable patterns _ => {} // should not be emitting unreachable warning - //~^ ERROR unreachable pattern + //~^ this arm is never executed } match BAZ { BAZ => {} //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` Baz::Baz1 => {} // should not be emitting unreachable warning - //~^ ERROR unreachable pattern + //~^ ERROR multiple unreachable patterns + //~| this arm is never executed _ => {} - //~^ ERROR unreachable pattern + //~^ this arm is never executed } match BAZ { @@ -91,15 +94,16 @@ fn main() { //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` _ => {} //~^ ERROR unreachable pattern + //~| this arm is never executed } match BAZ { BAZ => {} //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` Baz::Baz2 => {} // should not be emitting unreachable warning - //~^ ERROR unreachable pattern + //~^ ERROR multiple unreachable patterns _ => {} // should not be emitting unreachable warning - //~^ ERROR unreachable pattern + //~^ this arm is never executed } type Quux = fn(usize, usize) -> usize; diff --git a/tests/ui/pattern/usefulness/consts-opaque.stderr b/tests/ui/pattern/usefulness/consts-opaque.stderr index 35396751abecb..a20a6f7876ca8 100644 --- a/tests/ui/pattern/usefulness/consts-opaque.stderr +++ b/tests/ui/pattern/usefulness/consts-opaque.stderr @@ -5,13 +5,13 @@ LL | FOO => {} | ^^^ error: unreachable pattern - --> $DIR/consts-opaque.rs:32:9 + --> $DIR/consts-opaque.rs:30:9 | LL | FOO => {} - | --- matches any value + | ^^^ this pattern is irrefutable; subsequent arms are never executed LL | LL | _ => {} // should not be emitting unreachable warning - | ^ unreachable pattern + | ^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/consts-opaque.rs:6:9 @@ -20,22 +20,22 @@ LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ error: to use a constant of type `Foo` in a pattern, `Foo` must be annotated with `#[derive(PartialEq, Eq)]` - --> $DIR/consts-opaque.rs:37:9 + --> $DIR/consts-opaque.rs:38:9 | LL | FOO_REF => {} | ^^^^^^^ error: unreachable pattern - --> $DIR/consts-opaque.rs:39:9 + --> $DIR/consts-opaque.rs:38:9 | LL | FOO_REF => {} - | ------- matches any value + | ^^^^^^^ this pattern is irrefutable; subsequent arms are never executed LL | LL | Foo(_) => {} // should not be emitting unreachable warning - | ^^^^^^ unreachable pattern + | ^^^^^^^^^^^^ this arm is never executed warning: to use a constant of type `Foo` in a pattern, `Foo` must be annotated with `#[derive(PartialEq, Eq)]` - --> $DIR/consts-opaque.rs:45:9 + --> $DIR/consts-opaque.rs:46:9 | LL | FOO_REF_REF => {} | ^^^^^^^^^^^ @@ -45,158 +45,128 @@ LL | FOO_REF_REF => {} = note: `#[warn(indirect_structural_match)]` on by default error: to use a constant of type `Bar` in a pattern, `Bar` must be annotated with `#[derive(PartialEq, Eq)]` - --> $DIR/consts-opaque.rs:53:9 + --> $DIR/consts-opaque.rs:54:9 | LL | BAR => {} // should not be emitting unreachable warning | ^^^ -error: unreachable pattern +error: multiple unreachable patterns --> $DIR/consts-opaque.rs:53:9 | LL | Bar => {} - | --- matches any value + | ^^^ this pattern is irrefutable; subsequent arms are never executed LL | BAR => {} // should not be emitting unreachable warning - | ^^^ unreachable pattern - -error: unreachable pattern - --> $DIR/consts-opaque.rs:56:9 - | -LL | Bar => {} - | --- matches any value + | ^^^^^^^^^ this arm is never executed ... LL | _ => {} - | ^ unreachable pattern + | ^^^^^^^ this arm is never executed error: to use a constant of type `Bar` in a pattern, `Bar` must be annotated with `#[derive(PartialEq, Eq)]` - --> $DIR/consts-opaque.rs:61:9 + --> $DIR/consts-opaque.rs:62:9 | LL | BAR => {} | ^^^ -error: unreachable pattern - --> $DIR/consts-opaque.rs:63:9 +error: multiple unreachable patterns + --> $DIR/consts-opaque.rs:62:9 | LL | BAR => {} - | --- matches any value + | ^^^ this pattern is irrefutable; subsequent arms are never executed LL | LL | Bar => {} // should not be emitting unreachable warning - | ^^^ unreachable pattern - -error: unreachable pattern - --> $DIR/consts-opaque.rs:65:9 - | -LL | BAR => {} - | --- matches any value + | ^^^^^^^^^ this arm is never executed ... LL | _ => {} - | ^ unreachable pattern + | ^^^^^^^ this arm is never executed error: to use a constant of type `Bar` in a pattern, `Bar` must be annotated with `#[derive(PartialEq, Eq)]` - --> $DIR/consts-opaque.rs:70:9 + --> $DIR/consts-opaque.rs:72:9 | LL | BAR => {} | ^^^ error: to use a constant of type `Bar` in a pattern, `Bar` must be annotated with `#[derive(PartialEq, Eq)]` - --> $DIR/consts-opaque.rs:72:9 + --> $DIR/consts-opaque.rs:74:9 | LL | BAR => {} // should not be emitting unreachable warning | ^^^ -error: unreachable pattern +error: multiple unreachable patterns --> $DIR/consts-opaque.rs:72:9 | LL | BAR => {} - | --- matches any value + | ^^^ this pattern is irrefutable; subsequent arms are never executed LL | LL | BAR => {} // should not be emitting unreachable warning - | ^^^ unreachable pattern - -error: unreachable pattern - --> $DIR/consts-opaque.rs:75:9 - | -LL | BAR => {} - | --- matches any value + | ^^^^^^^^^ this arm is never executed ... LL | _ => {} // should not be emitting unreachable warning - | ^ unreachable pattern + | ^^^^^^^ this arm is never executed error: to use a constant of type `Baz` in a pattern, `Baz` must be annotated with `#[derive(PartialEq, Eq)]` - --> $DIR/consts-opaque.rs:80:9 + --> $DIR/consts-opaque.rs:82:9 | LL | BAZ => {} | ^^^ -error: unreachable pattern +error: multiple unreachable patterns --> $DIR/consts-opaque.rs:82:9 | LL | BAZ => {} - | --- matches any value + | ^^^ this pattern is irrefutable; subsequent arms are never executed LL | LL | Baz::Baz1 => {} // should not be emitting unreachable warning - | ^^^^^^^^^ unreachable pattern - -error: unreachable pattern - --> $DIR/consts-opaque.rs:84:9 - | -LL | BAZ => {} - | --- matches any value + | ^^^^^^^^^^^^^^^ this arm is never executed ... LL | _ => {} - | ^ unreachable pattern + | ^^^^^^^ this arm is never executed error: to use a constant of type `Baz` in a pattern, `Baz` must be annotated with `#[derive(PartialEq, Eq)]` - --> $DIR/consts-opaque.rs:90:9 + --> $DIR/consts-opaque.rs:93:9 | LL | BAZ => {} | ^^^ error: unreachable pattern - --> $DIR/consts-opaque.rs:92:9 + --> $DIR/consts-opaque.rs:93:9 | LL | BAZ => {} - | --- matches any value + | ^^^ this pattern is irrefutable; subsequent arms are never executed LL | LL | _ => {} - | ^ unreachable pattern + | ^^^^^^^ this arm is never executed error: to use a constant of type `Baz` in a pattern, `Baz` must be annotated with `#[derive(PartialEq, Eq)]` - --> $DIR/consts-opaque.rs:97:9 + --> $DIR/consts-opaque.rs:101:9 | LL | BAZ => {} | ^^^ -error: unreachable pattern - --> $DIR/consts-opaque.rs:99:9 +error: multiple unreachable patterns + --> $DIR/consts-opaque.rs:101:9 | LL | BAZ => {} - | --- matches any value + | ^^^ this pattern is irrefutable; subsequent arms are never executed LL | LL | Baz::Baz2 => {} // should not be emitting unreachable warning - | ^^^^^^^^^ unreachable pattern - -error: unreachable pattern - --> $DIR/consts-opaque.rs:101:9 - | -LL | BAZ => {} - | --- matches any value -... + | ^^^^^^^^^^^^^^^ this arm is never executed +LL | LL | _ => {} // should not be emitting unreachable warning - | ^ unreachable pattern + | ^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/consts-opaque.rs:127:9 + --> $DIR/consts-opaque.rs:130:9 | LL | Wrap(_) => {} - | ------- matches any value + | ^^^^^^^ this pattern is irrefutable; subsequent arms are never executed LL | WRAPQUUX => {} // detected unreachable because we do inspect the `Wrap` layer - | ^^^^^^^^ unreachable pattern + | ^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/consts-opaque.rs:141:9 + --> $DIR/consts-opaque.rs:145:9 | LL | WHOKNOWSQUUX => {} // detected unreachable because we do inspect the `WhoKnows` layer - | ^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^ this arm is never executed -error: aborting due to 24 previous errors; 1 warning emitted +error: aborting due to 19 previous errors; 1 warning emitted diff --git a/tests/ui/pattern/usefulness/empty-match.exhaustive_patterns.stderr b/tests/ui/pattern/usefulness/empty-match.exhaustive_patterns.stderr index 5e12bc1d22f01..002389aa83617 100644 --- a/tests/ui/pattern/usefulness/empty-match.exhaustive_patterns.stderr +++ b/tests/ui/pattern/usefulness/empty-match.exhaustive_patterns.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/empty-match.rs:37:9 | LL | _ => {}, - | ^ + | ^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/empty-match.rs:8:9 @@ -14,31 +14,31 @@ error: unreachable pattern --> $DIR/empty-match.rs:40:9 | LL | _ if false => {}, - | ^ + | ^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/empty-match.rs:47:9 | LL | _ => {}, - | ^ + | ^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/empty-match.rs:50:9 | LL | _ if false => {}, - | ^ + | ^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/empty-match.rs:57:9 | LL | _ => {}, - | ^ + | ^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/empty-match.rs:60:9 | LL | _ if false => {}, - | ^ + | ^^^^^^^^^^^^^^^^ this arm is never executed error[E0004]: non-exhaustive patterns: type `u8` is non-empty --> $DIR/empty-match.rs:78:20 diff --git a/tests/ui/pattern/usefulness/empty-match.normal.stderr b/tests/ui/pattern/usefulness/empty-match.normal.stderr index 5e12bc1d22f01..002389aa83617 100644 --- a/tests/ui/pattern/usefulness/empty-match.normal.stderr +++ b/tests/ui/pattern/usefulness/empty-match.normal.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/empty-match.rs:37:9 | LL | _ => {}, - | ^ + | ^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/empty-match.rs:8:9 @@ -14,31 +14,31 @@ error: unreachable pattern --> $DIR/empty-match.rs:40:9 | LL | _ if false => {}, - | ^ + | ^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/empty-match.rs:47:9 | LL | _ => {}, - | ^ + | ^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/empty-match.rs:50:9 | LL | _ if false => {}, - | ^ + | ^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/empty-match.rs:57:9 | LL | _ => {}, - | ^ + | ^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/empty-match.rs:60:9 | LL | _ if false => {}, - | ^ + | ^^^^^^^^^^^^^^^^ this arm is never executed error[E0004]: non-exhaustive patterns: type `u8` is non-empty --> $DIR/empty-match.rs:78:20 diff --git a/tests/ui/pattern/usefulness/floats.stderr b/tests/ui/pattern/usefulness/floats.stderr index c926e50b3580b..9578b4f43834d 100644 --- a/tests/ui/pattern/usefulness/floats.stderr +++ b/tests/ui/pattern/usefulness/floats.stderr @@ -15,7 +15,7 @@ error: unreachable pattern --> $DIR/floats.rs:16:7 | LL | 0.02f64 => {} - | ^^^^^^^ + | ^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/floats.rs:2:9 diff --git a/tests/ui/pattern/usefulness/integer-ranges/reachability.rs b/tests/ui/pattern/usefulness/integer-ranges/reachability.rs index fb4d59b05780e..724e4ee499053 100644 --- a/tests/ui/pattern/usefulness/integer-ranges/reachability.rs +++ b/tests/ui/pattern/usefulness/integer-ranges/reachability.rs @@ -7,6 +7,22 @@ macro_rules! m { match $s { $t1 => {} $t2 => {} + //~^ ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern + //~| ERROR unreachable pattern _ => {} } } @@ -14,32 +30,32 @@ macro_rules! m { fn main() { m!(0u8, 42, 41); - m!(0u8, 42, 42); //~ ERROR unreachable pattern + m!(0u8, 42, 42); m!(0u8, 42, 43); m!(0u8, 20..=30, 19); - m!(0u8, 20..=30, 20); //~ ERROR unreachable pattern - m!(0u8, 20..=30, 21); //~ ERROR unreachable pattern - m!(0u8, 20..=30, 25); //~ ERROR unreachable pattern - m!(0u8, 20..=30, 29); //~ ERROR unreachable pattern - m!(0u8, 20..=30, 30); //~ ERROR unreachable pattern + m!(0u8, 20..=30, 20); + m!(0u8, 20..=30, 21); + m!(0u8, 20..=30, 25); + m!(0u8, 20..=30, 29); + m!(0u8, 20..=30, 30); m!(0u8, 20..=30, 31); m!(0u8, 20..30, 19); - m!(0u8, 20..30, 20); //~ ERROR unreachable pattern - m!(0u8, 20..30, 21); //~ ERROR unreachable pattern - m!(0u8, 20..30, 25); //~ ERROR unreachable pattern - m!(0u8, 20..30, 29); //~ ERROR unreachable pattern + m!(0u8, 20..30, 20); + m!(0u8, 20..30, 21); + m!(0u8, 20..30, 25); + m!(0u8, 20..30, 29); m!(0u8, 20..30, 30); m!(0u8, 20..30, 31); - m!(0u8, 20..=30, 20..=30); //~ ERROR unreachable pattern - m!(0u8, 20.. 30, 20.. 30); //~ ERROR unreachable pattern - m!(0u8, 20..=30, 20.. 30); //~ ERROR unreachable pattern + m!(0u8, 20..=30, 20..=30); + m!(0u8, 20.. 30, 20.. 30); + m!(0u8, 20..=30, 20.. 30); m!(0u8, 20..=30, 19..=30); - m!(0u8, 20..=30, 21..=30); //~ ERROR unreachable pattern - m!(0u8, 20..=30, 20..=29); //~ ERROR unreachable pattern + m!(0u8, 20..=30, 21..=30); + m!(0u8, 20..=30, 20..=29); m!(0u8, 20..=30, 20..=31); - m!('a', 'A'..='z', 'a'..='z'); //~ ERROR unreachable pattern + m!('a', 'A'..='z', 'a'..='z'); match 0u8 { 5 => {}, @@ -102,7 +118,7 @@ fn main() { match &0 { &42 => {} &FOO => {} //~ ERROR unreachable pattern - BAR => {} //~ ERROR unreachable pattern + BAR => {} _ => {} } // Regression test, see https://github.com/rust-lang/rust/pull/66326#issuecomment-552889933 diff --git a/tests/ui/pattern/usefulness/integer-ranges/reachability.stderr b/tests/ui/pattern/usefulness/integer-ranges/reachability.stderr index 0ffb0ffd82aa0..277cfa0289065 100644 --- a/tests/ui/pattern/usefulness/integer-ranges/reachability.stderr +++ b/tests/ui/pattern/usefulness/integer-ranges/reachability.stderr @@ -1,154 +1,229 @@ error: unreachable pattern - --> $DIR/reachability.rs:17:17 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 42, 42); - | ^^ + | --------------- in this macro invocation | note: the lint level is defined here --> $DIR/reachability.rs:3:9 | LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:21:22 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..=30, 20); - | ^^ + | -------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:22:22 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..=30, 21); - | ^^ + | -------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:23:22 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..=30, 25); - | ^^ + | -------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:24:22 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..=30, 29); - | ^^ + | -------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:25:22 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..=30, 30); - | ^^ + | -------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:28:21 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..30, 20); - | ^^ + | ------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:29:21 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..30, 21); - | ^^ + | ------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:30:21 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..30, 25); - | ^^ + | ------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:31:21 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..30, 29); - | ^^ + | ------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:35:22 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..=30, 20..=30); - | ^^^^^^^ + | ------------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:36:22 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20.. 30, 20.. 30); - | ^^^^^^^ + | ------------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:37:22 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..=30, 20.. 30); - | ^^^^^^^ + | ------------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:39:22 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..=30, 21..=30); - | ^^^^^^^ + | ------------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:40:22 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!(0u8, 20..=30, 20..=29); - | ^^^^^^^ + | ------------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:42:24 + --> $DIR/reachability.rs:9:13 | +LL | $t2 => {} + | ^^^^^^^^^ this arm is never executed +... LL | m!('a', 'A'..='z', 'a'..='z'); - | ^^^^^^^^^ + | ----------------------------- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) error: unreachable pattern - --> $DIR/reachability.rs:49:9 + --> $DIR/reachability.rs:65:9 | LL | 5..=8 => {}, - | ^^^^^ + | ^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/reachability.rs:55:9 + --> $DIR/reachability.rs:71:9 | LL | 5..15 => {}, - | ^^^^^ + | ^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/reachability.rs:62:9 + --> $DIR/reachability.rs:78:9 | LL | 5..25 => {}, - | ^^^^^ + | ^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/reachability.rs:70:9 + --> $DIR/reachability.rs:86:9 | LL | 5..25 => {}, - | ^^^^^ + | ^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/reachability.rs:76:9 + --> $DIR/reachability.rs:92:9 | LL | 5..15 => {}, - | ^^^^^ + | ^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/reachability.rs:83:9 + --> $DIR/reachability.rs:98:9 | LL | _ => {}, - | - matches any value + | ^ this pattern is irrefutable; subsequent arms are never executed LL | '\u{D7FF}'..='\u{E000}' => {}, - | ^^^^^^^^^^^^^^^^^^^^^^^ unreachable pattern + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed -error: unreachable pattern - --> $DIR/reachability.rs:104:9 +error: multiple unreachable patterns + --> $DIR/reachability.rs:120:9 | LL | &FOO => {} - | ^^^^ - -error: unreachable pattern - --> $DIR/reachability.rs:105:9 - | + | ^^^^^^^^^^ this arm is never executed LL | BAR => {} - | ^^^ + | ^^^^^^^^^ this arm is never executed -error: aborting due to 24 previous errors +error: aborting due to 23 previous errors diff --git a/tests/ui/pattern/usefulness/issue-12116.stderr b/tests/ui/pattern/usefulness/issue-12116.stderr index 7f15c4703a31c..cc6344237b7e9 100644 --- a/tests/ui/pattern/usefulness/issue-12116.stderr +++ b/tests/ui/pattern/usefulness/issue-12116.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/issue-12116.rs:15:9 | LL | &IntList::Cons(val, box IntList::Nil) => IntList::Cons(val, Box::new(IntList::Nil)), - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/issue-12116.rs:4:9 diff --git a/tests/ui/pattern/usefulness/issue-12369.stderr b/tests/ui/pattern/usefulness/issue-12369.stderr index aab2be78c9a4c..9d4c0e5d9a673 100644 --- a/tests/ui/pattern/usefulness/issue-12369.stderr +++ b/tests/ui/pattern/usefulness/issue-12369.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/issue-12369.rs:9:9 | LL | &[10,a, ref rest @ ..] => 10 - | ^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/issue-12369.rs:1:9 diff --git a/tests/ui/pattern/usefulness/issue-13727.stderr b/tests/ui/pattern/usefulness/issue-13727.stderr index 07ca56a566ff1..874984e38abff 100644 --- a/tests/ui/pattern/usefulness/issue-13727.stderr +++ b/tests/ui/pattern/usefulness/issue-13727.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/issue-13727.rs:7:5 | LL | 512 => print!("0b1111\n"), - | ^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/issue-13727.rs:2:9 diff --git a/tests/ui/pattern/usefulness/issue-30240-b.stderr b/tests/ui/pattern/usefulness/issue-30240-b.stderr index 59d64bc256b50..f774c71c92819 100644 --- a/tests/ui/pattern/usefulness/issue-30240-b.stderr +++ b/tests/ui/pattern/usefulness/issue-30240-b.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/issue-30240-b.rs:12:9 | LL | "hello" => {} - | ^^^^^^^ + | ^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/issue-30240-b.rs:1:9 diff --git a/tests/ui/pattern/usefulness/issue-31221.stderr b/tests/ui/pattern/usefulness/issue-31221.stderr index 7d34914445637..2c27e88b99df2 100644 --- a/tests/ui/pattern/usefulness/issue-31221.stderr +++ b/tests/ui/pattern/usefulness/issue-31221.stderr @@ -1,10 +1,10 @@ error: unreachable pattern - --> $DIR/issue-31221.rs:18:9 + --> $DIR/issue-31221.rs:17:9 | LL | Var3 => (), - | ---- matches any value + | ^^^^ this pattern is irrefutable; subsequent arms are never executed LL | Var2 => (), - | ^^^^ unreachable pattern + | ^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/issue-31221.rs:4:9 @@ -13,20 +13,20 @@ LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ error: unreachable pattern - --> $DIR/issue-31221.rs:24:9 + --> $DIR/issue-31221.rs:23:9 | LL | &Var3 => (), - | ----- matches any value + | ^^^^^ this pattern is irrefutable; subsequent arms are never executed LL | &Var2 => (), - | ^^^^^ unreachable pattern + | ^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/issue-31221.rs:31:9 + --> $DIR/issue-31221.rs:30:9 | LL | (c, d) => (), - | ------ matches any value + | ^^^^^^ this pattern is irrefutable; subsequent arms are never executed LL | anything => () - | ^^^^^^^^ unreachable pattern + | ^^^^^^^^^^^^^^ this arm is never executed error: aborting due to 3 previous errors diff --git a/tests/ui/pattern/usefulness/issue-57472.stderr b/tests/ui/pattern/usefulness/issue-57472.stderr index 26efdf6dbaf34..6da15fa18e93a 100644 --- a/tests/ui/pattern/usefulness/issue-57472.stderr +++ b/tests/ui/pattern/usefulness/issue-57472.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/issue-57472.rs:15:13 | LL | Punned { bar: [_], .. } => println!("bar"), - | ^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/issue-57472.rs:2:9 @@ -14,7 +14,7 @@ error: unreachable pattern --> $DIR/issue-57472.rs:31:13 | LL | Punned { bar: [_] } => println!("bar"), - | ^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed error: aborting due to 2 previous errors diff --git a/tests/ui/pattern/usefulness/match-arm-statics.stderr b/tests/ui/pattern/usefulness/match-arm-statics.stderr index a5dffebf69967..350f92a6e8c47 100644 --- a/tests/ui/pattern/usefulness/match-arm-statics.stderr +++ b/tests/ui/pattern/usefulness/match-arm-statics.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/match-arm-statics.rs:25:9 | LL | (true, true) => () - | ^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/match-arm-statics.rs:2:9 @@ -14,13 +14,13 @@ error: unreachable pattern --> $DIR/match-arm-statics.rs:40:9 | LL | Some(Some(East)) => (), - | ^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/match-arm-statics.rs:60:9 | LL | Foo { bar: Some(EAST), baz: NewBool(false) } => () - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed error: aborting due to 3 previous errors diff --git a/tests/ui/pattern/usefulness/match-byte-array-patterns.stderr b/tests/ui/pattern/usefulness/match-byte-array-patterns.stderr index 0c582be8df8bc..8beff81c2527b 100644 --- a/tests/ui/pattern/usefulness/match-byte-array-patterns.stderr +++ b/tests/ui/pattern/usefulness/match-byte-array-patterns.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/match-byte-array-patterns.rs:8:9 | LL | &[0x41, 0x41, 0x41, 0x41] => {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/match-byte-array-patterns.rs:1:9 @@ -14,43 +14,43 @@ error: unreachable pattern --> $DIR/match-byte-array-patterns.rs:14:9 | LL | b"AAAA" => {}, - | ^^^^^^^ + | ^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/match-byte-array-patterns.rs:20:9 | LL | b"AAAA" => {}, - | ^^^^^^^ + | ^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/match-byte-array-patterns.rs:26:9 | LL | b"AAAA" => {}, - | ^^^^^^^ + | ^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/match-byte-array-patterns.rs:34:9 | LL | &[0x41, 0x41, 0x41, 0x41] => {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/match-byte-array-patterns.rs:40:9 | LL | b"AAAA" => {}, - | ^^^^^^^ + | ^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/match-byte-array-patterns.rs:46:9 | LL | b"AAAA" => {}, - | ^^^^^^^ + | ^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/match-byte-array-patterns.rs:52:9 | LL | b"AAAA" => {}, - | ^^^^^^^ + | ^^^^^^^^^^^^^ this arm is never executed error: aborting due to 8 previous errors diff --git a/tests/ui/pattern/usefulness/match-ref-ice.stderr b/tests/ui/pattern/usefulness/match-ref-ice.stderr index fad0940baa441..91f1a9e96e5b3 100644 --- a/tests/ui/pattern/usefulness/match-ref-ice.stderr +++ b/tests/ui/pattern/usefulness/match-ref-ice.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/match-ref-ice.rs:13:9 | LL | [1, 2, 3] => (), - | ^^^^^^^^^ + | ^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/match-ref-ice.rs:1:9 diff --git a/tests/ui/pattern/usefulness/match-vec-fixed.stderr b/tests/ui/pattern/usefulness/match-vec-fixed.stderr index e388a06cb9a14..eec9d4a898d41 100644 --- a/tests/ui/pattern/usefulness/match-vec-fixed.stderr +++ b/tests/ui/pattern/usefulness/match-vec-fixed.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/match-vec-fixed.rs:7:9 | LL | [_, _, _] => {} - | ^^^^^^^^^ + | ^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/match-vec-fixed.rs:1:9 @@ -14,7 +14,7 @@ error: unreachable pattern --> $DIR/match-vec-fixed.rs:11:9 | LL | [_, 1, _] => {} - | ^^^^^^^^^ + | ^^^^^^^^^^^^^^^ this arm is never executed error: aborting due to 2 previous errors diff --git a/tests/ui/pattern/usefulness/match-vec-unreachable.stderr b/tests/ui/pattern/usefulness/match-vec-unreachable.stderr index 672fd92fb5ebd..2c7dd7358584c 100644 --- a/tests/ui/pattern/usefulness/match-vec-unreachable.stderr +++ b/tests/ui/pattern/usefulness/match-vec-unreachable.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/match-vec-unreachable.rs:8:9 | LL | [(1, 2), (2, 3), b] => (), - | ^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/match-vec-unreachable.rs:1:9 @@ -14,13 +14,13 @@ error: unreachable pattern --> $DIR/match-vec-unreachable.rs:18:9 | LL | [_, _, _, _, _] => { } - | ^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/match-vec-unreachable.rs:26:9 | LL | ['a', 'b', 'c'] => {} - | ^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^ this arm is never executed error: aborting due to 3 previous errors diff --git a/tests/ui/pattern/usefulness/slice-pattern-const-2.stderr b/tests/ui/pattern/usefulness/slice-pattern-const-2.stderr index dcad11a38a7eb..031a30ec7ae5f 100644 --- a/tests/ui/pattern/usefulness/slice-pattern-const-2.stderr +++ b/tests/ui/pattern/usefulness/slice-pattern-const-2.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/slice-pattern-const-2.rs:9:9 | LL | [4, 5, 6, 7] => (), - | ^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/slice-pattern-const-2.rs:1:9 @@ -14,19 +14,19 @@ error: unreachable pattern --> $DIR/slice-pattern-const-2.rs:15:9 | LL | [4, 5, 6, 7] => (), - | ^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/slice-pattern-const-2.rs:21:9 | LL | MAGIC_TEST => (), - | ^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/slice-pattern-const-2.rs:28:9 | LL | FOO => (), - | ^^^ + | ^^^^^^^^^ this arm is never executed error: aborting due to 4 previous errors diff --git a/tests/ui/pattern/usefulness/slice-pattern-const-3.stderr b/tests/ui/pattern/usefulness/slice-pattern-const-3.stderr index b90b3a88a1860..2856a340569e9 100644 --- a/tests/ui/pattern/usefulness/slice-pattern-const-3.stderr +++ b/tests/ui/pattern/usefulness/slice-pattern-const-3.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/slice-pattern-const-3.rs:9:9 | LL | ["4", "5", "6", "7"] => (), - | ^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/slice-pattern-const-3.rs:1:9 @@ -14,19 +14,19 @@ error: unreachable pattern --> $DIR/slice-pattern-const-3.rs:15:9 | LL | ["4", "5", "6", "7"] => (), - | ^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/slice-pattern-const-3.rs:21:9 | LL | MAGIC_TEST => (), - | ^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/slice-pattern-const-3.rs:28:9 | LL | FOO => (), - | ^^^ + | ^^^^^^^^^ this arm is never executed error: aborting due to 4 previous errors diff --git a/tests/ui/pattern/usefulness/slice-pattern-const.rs b/tests/ui/pattern/usefulness/slice-pattern-const.rs index 89195d5b11e52..2e9b145b8ec95 100644 --- a/tests/ui/pattern/usefulness/slice-pattern-const.rs +++ b/tests/ui/pattern/usefulness/slice-pattern-const.rs @@ -40,9 +40,13 @@ fn main() { const BOO: &[u8; 0] = &[]; match &[] { [] => (), - BOO => (), //~ ERROR unreachable pattern - b"" => (), //~ ERROR unreachable pattern - _ => (), //~ ERROR unreachable pattern + BOO => (), + //~^ ERROR multiple unreachable patterns + //~| this arm is never executed + b"" => (), + //~^ this arm is never executed + _ => (), + //~^ this arm is never executed } const CONST1: &[bool; 1] = &[true]; diff --git a/tests/ui/pattern/usefulness/slice-pattern-const.stderr b/tests/ui/pattern/usefulness/slice-pattern-const.stderr index 1fffb9fedbf2e..be46aa0a201cb 100644 --- a/tests/ui/pattern/usefulness/slice-pattern-const.stderr +++ b/tests/ui/pattern/usefulness/slice-pattern-const.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/slice-pattern-const.rs:9:9 | LL | [84, 69, 83, 84] => (), - | ^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/slice-pattern-const.rs:1:9 @@ -14,49 +14,43 @@ error: unreachable pattern --> $DIR/slice-pattern-const.rs:15:9 | LL | [84, 69, 83, 84] => (), - | ^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/slice-pattern-const.rs:21:9 | LL | MAGIC_TEST => (), - | ^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/slice-pattern-const.rs:28:9 | LL | FOO => (), - | ^^^ + | ^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/slice-pattern-const.rs:35:9 | LL | BAR => (), - | ^^^ + | ^^^^^^^^^ this arm is never executed -error: unreachable pattern +error: multiple unreachable patterns --> $DIR/slice-pattern-const.rs:43:9 | LL | BOO => (), - | ^^^ - -error: unreachable pattern - --> $DIR/slice-pattern-const.rs:44:9 - | + | ^^^^^^^^^ this arm is never executed +... LL | b"" => (), - | ^^^ - -error: unreachable pattern - --> $DIR/slice-pattern-const.rs:45:9 - | + | ^^^^^^^^^ this arm is never executed +LL | LL | _ => (), - | ^ + | ^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/slice-pattern-const.rs:51:9 + --> $DIR/slice-pattern-const.rs:55:9 | LL | [true] => {} - | ^^^^^^ + | ^^^^^^^^^^^^ this arm is never executed -error: aborting due to 9 previous errors +error: aborting due to 7 previous errors diff --git a/tests/ui/pattern/usefulness/slice-patterns-reachability.rs b/tests/ui/pattern/usefulness/slice-patterns-reachability.rs index 7c747b5e0b9d3..9d8b7b3a14dbe 100644 --- a/tests/ui/pattern/usefulness/slice-patterns-reachability.rs +++ b/tests/ui/pattern/usefulness/slice-patterns-reachability.rs @@ -5,20 +5,29 @@ fn main() { match s { [true, ..] => {} - [true, ..] => {} //~ ERROR unreachable pattern - [true] => {} //~ ERROR unreachable pattern + [true, ..] => {} + //~^ ERROR multiple unreachable patterns + //~| this arm is never executed + [true] => {} + //~^ this arm is never executed [..] => {} } match s { [.., true] => {} - [.., true] => {} //~ ERROR unreachable pattern - [true] => {} //~ ERROR unreachable pattern + [.., true] => {} + //~^ ERROR multiple unreachable patterns + //~| this arm is never executed + [true] => {} + //~^ this arm is never executed [..] => {} } match s { [false, .., true] => {} - [false, .., true] => {} //~ ERROR unreachable pattern - [false, true] => {} //~ ERROR unreachable pattern + [false, .., true] => {} + //~^ ERROR multiple unreachable patterns + //~| this arm is never executed + [false, true] => {} + //~^ this arm is never executed [false] => {} [..] => {} } diff --git a/tests/ui/pattern/usefulness/slice-patterns-reachability.stderr b/tests/ui/pattern/usefulness/slice-patterns-reachability.stderr index 607ffb76595e9..2607d0b8bac40 100644 --- a/tests/ui/pattern/usefulness/slice-patterns-reachability.stderr +++ b/tests/ui/pattern/usefulness/slice-patterns-reachability.stderr @@ -1,8 +1,11 @@ -error: unreachable pattern +error: multiple unreachable patterns --> $DIR/slice-patterns-reachability.rs:8:9 | LL | [true, ..] => {} - | ^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^ this arm is never executed +... +LL | [true] => {} + | ^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/slice-patterns-reachability.rs:1:9 @@ -10,35 +13,23 @@ note: the lint level is defined here LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ -error: unreachable pattern - --> $DIR/slice-patterns-reachability.rs:9:9 - | -LL | [true] => {} - | ^^^^^^ - -error: unreachable pattern - --> $DIR/slice-patterns-reachability.rs:14:9 +error: multiple unreachable patterns + --> $DIR/slice-patterns-reachability.rs:17:9 | LL | [.., true] => {} - | ^^^^^^^^^^ - -error: unreachable pattern - --> $DIR/slice-patterns-reachability.rs:15:9 - | + | ^^^^^^^^^^^^^^^^ this arm is never executed +... LL | [true] => {} - | ^^^^^^ + | ^^^^^^^^^^^^ this arm is never executed -error: unreachable pattern - --> $DIR/slice-patterns-reachability.rs:20:9 +error: multiple unreachable patterns + --> $DIR/slice-patterns-reachability.rs:26:9 | LL | [false, .., true] => {} - | ^^^^^^^^^^^^^^^^^ - -error: unreachable pattern - --> $DIR/slice-patterns-reachability.rs:21:9 - | + | ^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed +... LL | [false, true] => {} - | ^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^ this arm is never executed -error: aborting due to 6 previous errors +error: aborting due to 3 previous errors diff --git a/tests/ui/pattern/usefulness/struct-pattern-match-useless.stderr b/tests/ui/pattern/usefulness/struct-pattern-match-useless.stderr index fbee33de6f30a..0c81b4a24b4b2 100644 --- a/tests/ui/pattern/usefulness/struct-pattern-match-useless.stderr +++ b/tests/ui/pattern/usefulness/struct-pattern-match-useless.stderr @@ -1,10 +1,10 @@ error: unreachable pattern - --> $DIR/struct-pattern-match-useless.rs:12:9 + --> $DIR/struct-pattern-match-useless.rs:11:9 | LL | Foo { x: _x, y: _y } => (), - | -------------------- matches any value + | ^^^^^^^^^^^^^^^^^^^^ this pattern is irrefutable; subsequent arms are never executed LL | Foo { .. } => () - | ^^^^^^^^^^ unreachable pattern + | ^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/struct-pattern-match-useless.rs:1:9 diff --git a/tests/ui/pattern/usefulness/top-level-alternation.rs b/tests/ui/pattern/usefulness/top-level-alternation.rs index e8cd12ea4a2c4..ebabab331db48 100644 --- a/tests/ui/pattern/usefulness/top-level-alternation.rs +++ b/tests/ui/pattern/usefulness/top-level-alternation.rs @@ -1,22 +1,31 @@ #![deny(unreachable_patterns)] fn main() { - while let 0..=2 | 1 = 0 {} //~ ERROR unreachable pattern - if let 0..=2 | 1 = 0 {} //~ ERROR unreachable pattern - + while let 0..=2 | 1 = 0 {} + //~^ ERROR unreachable pattern + //~| this pattern is unreachable + if let 0..=2 | 1 = 0 {} + //~^ ERROR unreachable pattern + //~| this pattern is unreachable match 0u8 { 0 - | 0 => {} //~ ERROR unreachable pattern + | 0 => {} + //~^ ERROR unreachable pattern + //~| this pattern is unreachable _ => {} } match Some(0u8) { Some(0) - | Some(0) => {} //~ ERROR unreachable pattern + | Some(0) => {} + //~^ ERROR unreachable pattern + //~| this pattern is unreachable _ => {} } match (0u8, 0u8) { (0, _) | (_, 0) => {} - (0, 0) => {} //~ ERROR unreachable pattern + (0, 0) => {} + //~^ ERROR unreachable pattern + //~| this arm is never executed (1, 1) => {} _ => {} } @@ -36,22 +45,32 @@ fn main() { } match Some(0u8) { None | Some(_) => {} - _ => {} //~ ERROR unreachable pattern + _ => {} + //~^ ERROR unreachable pattern + //~| this arm is never executed } match Some(0u8) { None | Some(_) => {} - Some(_) => {} //~ ERROR unreachable pattern - None => {} //~ ERROR unreachable pattern + Some(_) => {} + //~^ ERROR multiple unreachable patterns + //~| this arm is never executed + None => {} } match Some(0u8) { Some(_) => {} None => {} - None | Some(_) => {} //~ ERROR unreachable pattern + None | Some(_) => {} + //~^ ERROR unreachable pattern + //~| this arm is never executed } match 0u8 { 1 | 2 => {}, - 1..=2 => {}, //~ ERROR unreachable pattern + 1..=2 => {}, + //~^ ERROR unreachable pattern + //~| this arm is never executed _ => {}, } - let (0 | 0) = 0 else { return }; //~ ERROR unreachable pattern + let (0 | 0) = 0 else { return }; + //~^ ERROR unreachable pattern + //~| this pattern is unreachable } diff --git a/tests/ui/pattern/usefulness/top-level-alternation.stderr b/tests/ui/pattern/usefulness/top-level-alternation.stderr index 17fa951c53905..4eb3d654477a1 100644 --- a/tests/ui/pattern/usefulness/top-level-alternation.stderr +++ b/tests/ui/pattern/usefulness/top-level-alternation.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/top-level-alternation.rs:4:23 | LL | while let 0..=2 | 1 = 0 {} - | ^ + | ^ this pattern is unreachable | note: the lint level is defined here --> $DIR/top-level-alternation.rs:1:9 @@ -11,64 +11,61 @@ LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ error: unreachable pattern - --> $DIR/top-level-alternation.rs:5:20 + --> $DIR/top-level-alternation.rs:7:20 | LL | if let 0..=2 | 1 = 0 {} - | ^ + | ^ this pattern is unreachable error: unreachable pattern - --> $DIR/top-level-alternation.rs:9:15 + --> $DIR/top-level-alternation.rs:12:15 | LL | | 0 => {} - | ^ + | ^ this pattern is unreachable error: unreachable pattern - --> $DIR/top-level-alternation.rs:14:15 + --> $DIR/top-level-alternation.rs:19:15 | LL | | Some(0) => {} - | ^^^^^^^ + | ^^^^^^^ this pattern is unreachable error: unreachable pattern - --> $DIR/top-level-alternation.rs:19:9 + --> $DIR/top-level-alternation.rs:26:9 | LL | (0, 0) => {} - | ^^^^^^ + | ^^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/top-level-alternation.rs:39:9 + --> $DIR/top-level-alternation.rs:48:9 | LL | _ => {} - | ^ + | ^^^^^^^ this arm is never executed -error: unreachable pattern - --> $DIR/top-level-alternation.rs:43:9 +error: multiple unreachable patterns + --> $DIR/top-level-alternation.rs:54:9 | LL | Some(_) => {} - | ^^^^^^^ - -error: unreachable pattern - --> $DIR/top-level-alternation.rs:44:9 - | + | ^^^^^^^^^^^^^ this arm is never executed +... LL | None => {} - | ^^^^ + | ^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/top-level-alternation.rs:49:9 + --> $DIR/top-level-alternation.rs:62:9 | LL | None | Some(_) => {} - | ^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/top-level-alternation.rs:53:9 + --> $DIR/top-level-alternation.rs:68:9 | LL | 1..=2 => {}, - | ^^^^^ + | ^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/top-level-alternation.rs:56:14 + --> $DIR/top-level-alternation.rs:73:14 | LL | let (0 | 0) = 0 else { return }; - | ^ + | ^ this pattern is unreachable -error: aborting due to 11 previous errors +error: aborting due to 10 previous errors diff --git a/tests/ui/reachable/unreachable-arm.stderr b/tests/ui/reachable/unreachable-arm.stderr index 1cbea8288d465..96e50485945d0 100644 --- a/tests/ui/reachable/unreachable-arm.stderr +++ b/tests/ui/reachable/unreachable-arm.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/unreachable-arm.rs:11:9 | LL | Foo::A(_, 1) => { } - | ^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/unreachable-arm.rs:4:9 diff --git a/tests/ui/reachable/unreachable-loop-patterns.stderr b/tests/ui/reachable/unreachable-loop-patterns.stderr index 80ffa5d73f034..9d16d497e9061 100644 --- a/tests/ui/reachable/unreachable-loop-patterns.stderr +++ b/tests/ui/reachable/unreachable-loop-patterns.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/unreachable-loop-patterns.rs:18:9 | LL | for _ in unimplemented!() as Void {} - | ^ + | ^ this pattern is unreachable | note: the lint level is defined here --> $DIR/unreachable-loop-patterns.rs:5:9 diff --git a/tests/ui/reachable/unreachable-try-pattern.stderr b/tests/ui/reachable/unreachable-try-pattern.stderr index 8f3e23119fb9e..c07c69ed6f82e 100644 --- a/tests/ui/reachable/unreachable-try-pattern.stderr +++ b/tests/ui/reachable/unreachable-try-pattern.stderr @@ -17,7 +17,7 @@ warning: unreachable pattern --> $DIR/unreachable-try-pattern.rs:19:24 | LL | let y = (match x { Ok(n) => Ok(n as u32), Err(e) => Err(e) })?; - | ^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/unreachable-try-pattern.rs:4:9 @@ -29,7 +29,7 @@ warning: unreachable pattern --> $DIR/unreachable-try-pattern.rs:30:40 | LL | let y = (match x { Ok(n) => Ok(n), Err(e) => Err(e) })?; - | ^^^^^^ + | ^^^^^^^^^^^^^^^^ this arm is never executed warning: 3 warnings emitted diff --git a/tests/ui/rfc-2008-non-exhaustive/enum_same_crate_empty_match.stderr b/tests/ui/rfc-2008-non-exhaustive/enum_same_crate_empty_match.stderr index de1bf8be8854e..319e0f9f74bc3 100644 --- a/tests/ui/rfc-2008-non-exhaustive/enum_same_crate_empty_match.stderr +++ b/tests/ui/rfc-2008-non-exhaustive/enum_same_crate_empty_match.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/enum_same_crate_empty_match.rs:28:9 | LL | _ => {} - | ^ + | ^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/enum_same_crate_empty_match.rs:1:9 diff --git a/tests/ui/rfc-2008-non-exhaustive/uninhabited/issue-65157-repeated-match-arm.stderr b/tests/ui/rfc-2008-non-exhaustive/uninhabited/issue-65157-repeated-match-arm.stderr index f39e6ee298544..dac0286182d3f 100644 --- a/tests/ui/rfc-2008-non-exhaustive/uninhabited/issue-65157-repeated-match-arm.stderr +++ b/tests/ui/rfc-2008-non-exhaustive/uninhabited/issue-65157-repeated-match-arm.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/issue-65157-repeated-match-arm.rs:15:9 | LL | PartiallyInhabitedVariants::Struct { .. } => {}, - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/issue-65157-repeated-match-arm.rs:2:9 diff --git a/tests/ui/rfc-2008-non-exhaustive/uninhabited/patterns_same_crate.stderr b/tests/ui/rfc-2008-non-exhaustive/uninhabited/patterns_same_crate.stderr index 8bfd6e91f4dec..993ad457e2214 100644 --- a/tests/ui/rfc-2008-non-exhaustive/uninhabited/patterns_same_crate.stderr +++ b/tests/ui/rfc-2008-non-exhaustive/uninhabited/patterns_same_crate.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/patterns_same_crate.rs:52:9 | LL | Some(_x) => (), - | ^^^^^^^^ + | ^^^^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/patterns_same_crate.rs:1:9 @@ -14,25 +14,25 @@ error: unreachable pattern --> $DIR/patterns_same_crate.rs:57:9 | LL | Some(_x) => (), - | ^^^^^^^^ + | ^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern --> $DIR/patterns_same_crate.rs:61:15 | LL | while let PartiallyInhabitedVariants::Struct { x } = partially_inhabited_variant() { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this pattern is unreachable error: unreachable pattern --> $DIR/patterns_same_crate.rs:65:15 | LL | while let Some(_x) = uninhabited_struct() { - | ^^^^^^^^ + | ^^^^^^^^ this pattern is unreachable error: unreachable pattern --> $DIR/patterns_same_crate.rs:68:15 | LL | while let Some(_x) = uninhabited_tuple_struct() { - | ^^^^^^^^ + | ^^^^^^^^ this pattern is unreachable error: aborting due to 5 previous errors diff --git a/tests/ui/rfc-2294-if-let-guard/warns.stderr b/tests/ui/rfc-2294-if-let-guard/warns.stderr index 75f22ac8dc03a..03d3aa40a9c43 100644 --- a/tests/ui/rfc-2294-if-let-guard/warns.stderr +++ b/tests/ui/rfc-2294-if-let-guard/warns.stderr @@ -16,7 +16,7 @@ error: unreachable pattern --> $DIR/warns.rs:15:25 | LL | x if let None | None = x => {} - | ^^^^ + | ^^^^ this pattern is unreachable | note: the lint level is defined here --> $DIR/warns.rs:12:8 diff --git a/tests/ui/uninhabited/uninhabited-patterns.rs b/tests/ui/uninhabited/uninhabited-patterns.rs index f1573b6adf0ce..99964076e73b1 100644 --- a/tests/ui/uninhabited/uninhabited-patterns.rs +++ b/tests/ui/uninhabited/uninhabited-patterns.rs @@ -29,19 +29,25 @@ fn main() { let x: Result, &[Result]> = Err(&[]); match x { - Ok(box _) => (), //~ ERROR unreachable pattern + Ok(box _) => (), + //~^ ERROR multiple unreachable patterns + //~| this arm is never executed Err(&[]) => (), - Err(&[..]) => (), //~ ERROR unreachable pattern + Err(&[..]) => (), + //~^ this arm is never executed } let x: Result> = Err(Err(123)); match x { Ok(_y) => (), Err(Err(_y)) => (), - Err(Ok(_y)) => (), //~ ERROR unreachable pattern + Err(Ok(_y)) => (), + //~^ ERROR unreachable pattern + //~| this arm is never executed } while let Some(_y) = foo() { //~^ ERROR unreachable pattern + //~| this pattern is unreachable } } diff --git a/tests/ui/uninhabited/uninhabited-patterns.stderr b/tests/ui/uninhabited/uninhabited-patterns.stderr index 655569ad6e086..a3e9322c39e74 100644 --- a/tests/ui/uninhabited/uninhabited-patterns.stderr +++ b/tests/ui/uninhabited/uninhabited-patterns.stderr @@ -2,7 +2,7 @@ error: unreachable pattern --> $DIR/uninhabited-patterns.rs:27:9 | LL | &[..] => (), - | ^^^^^ + | ^^^^^^^^^^^ this arm is never executed | note: the lint level is defined here --> $DIR/uninhabited-patterns.rs:6:9 @@ -10,29 +10,26 @@ note: the lint level is defined here LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ -error: unreachable pattern +error: multiple unreachable patterns --> $DIR/uninhabited-patterns.rs:32:9 | LL | Ok(box _) => (), - | ^^^^^^^^^ - -error: unreachable pattern - --> $DIR/uninhabited-patterns.rs:34:9 - | + | ^^^^^^^^^^^^^^^ this arm is never executed +... LL | Err(&[..]) => (), - | ^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/uninhabited-patterns.rs:41:9 + --> $DIR/uninhabited-patterns.rs:44:9 | LL | Err(Ok(_y)) => (), - | ^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^ this arm is never executed error: unreachable pattern - --> $DIR/uninhabited-patterns.rs:44:15 + --> $DIR/uninhabited-patterns.rs:49:15 | LL | while let Some(_y) = foo() { - | ^^^^^^^^ + | ^^^^^^^^ this pattern is unreachable -error: aborting due to 5 previous errors +error: aborting due to 4 previous errors