Unconditionally lower match arm even if it's unneeded for never patte… · rust-lang/rust@d504f70 (original) (raw)
File tree
3 files changed
lines changed
- compiler/rustc_ast_lowering/src
3 files changed
lines changed
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -672,10 +672,13 @@ impl<'hir> LoweringContext<'_, 'hir> { | ||
672 | 672 | let span = self.lower_span(arm.span); |
673 | 673 | self.lower_attrs(hir_id, &arm.attrs); |
674 | 674 | let is_never_pattern = pat.is_never_pattern(); |
675 | -let body = if let Some(body) = &arm.body | |
675 | +// We need to lower the body even if it's unneeded for never pattern in match, | |
676 | +// ensure that we can get HirId for DefId if need (issue #137708). | |
677 | +let body = arm.body.as_ref().map(|x | |
678 | +let body = if let Some(body) = body | |
676 | 679 | && !is_never_pattern |
677 | 680 | { |
678 | -self.lower_expr(body) | |
681 | + body | |
679 | 682 | } else { |
680 | 683 | // Either `body.is_none()` or `is_never_pattern` here. |
681 | 684 | if !is_never_pattern { |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
1 | +fn a() { | |
2 | +match 0 { | |
3 | + ! => | | |
4 | +//~^ ERROR a never pattern is always unreachable | |
5 | +//~^^ ERROR mismatched types | |
6 | +use std::ops::Add; | |
7 | +0.add(1) | |
8 | +}, | |
9 | +} | |
10 | +} | |
11 | + | |
12 | +fn main() {} |
| Original file line number | Diff line number | Diff line change | | | ------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------- | | | @@ -0,0 +1,36 @@ | | | | | | 1 | +error[E0658]: `!` patterns are experimental | | | | | 2 | + --> $DIR/unused_trait_in_never_pattern_body.rs:3:9 | | | | | 3 | + | | | | | | 4 | +LL | ! => | | { | | | | 5 | + | ^ | | | | | 6 | + | | | | | | 7 | + = note: see issue #118155 https://github.com/rust-lang/rust/issues/118155 for more information | | | | | 8 | + = help: add `#![feature(never_patterns)]` to the crate attributes to enable | | | | | 9 | + = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date | | | | | 10 | + | | | | | 11 | +error: a never pattern is always unreachable | | | | | 12 | + --> $DIR/unused_trait_in_never_pattern_body.rs:3:14 | | | | | 13 | + | | | | | | 14 | +LL | ! => | | { | | | | 15 | + | ______________^ | | | | | 16 | +LL | | | | | | 17 | +LL | | | | | | 18 | +LL | | use std::ops::Add; | | | | 19 | +LL | | 0.add(1) | | | | 20 | +LL | | }, | | | | 21 | + | | ^ | | | | 22 | + | | | | | | 23 | + | | _________this will never be executed | | | | 24 | + | help: remove this expression | | | | | 25 | + | | | | | 26 | +error: mismatched types | | | | | 27 | + --> $DIR/unused_trait_in_never_pattern_body.rs:3:9 | | | | | 28 | + | | | | | | 29 | +LL | ! => | | { | | | | 30 | + | ^ a never pattern must be used on an uninhabited type | | | | | 31 | + | | | | | | 32 | + = note: the matched value is of type `i32` | | | | | 33 | + | | | | | 34 | +error: aborting due to 3 previous errors | | | | | 35 | + | | | | | 36 | +For more information about this error, try `rustc --explain E0658`. | | |