diff --git a/src/librustc_typeck/check/_match.rs b/src/librustc_typeck/check/_match.rs index c9158af178fe..b4c969447de5 100644 --- a/src/librustc_typeck/check/_match.rs +++ b/src/librustc_typeck/check/_match.rs @@ -608,10 +608,6 @@ https://doc.rust-lang.org/reference/types.html#trait-objects"); self.check_expr_has_type_or_error(discrim, discrim_ty); }; - // If the discriminant diverges, the match is pointless (e.g., - // `match (return) { }`). - self.warn_if_unreachable(expr.id, expr.span, "expression"); - // If there are no arms, that is a diverging match; a special case. if arms.is_empty() { self.diverges.set(self.diverges.get() | Diverges::Always); @@ -620,7 +616,6 @@ https://doc.rust-lang.org/reference/types.html#trait-objects"); // Otherwise, we have to union together the types that the // arms produce and so forth. - let discrim_diverges = self.diverges.get(); self.diverges.set(Diverges::Maybe); diff --git a/src/test/ui/unreachable/unwarned-match-on-never.rs b/src/test/ui/unreachable/unwarned-match-on-never.rs new file mode 100644 index 000000000000..0c160615c8b6 --- /dev/null +++ b/src/test/ui/unreachable/unwarned-match-on-never.rs @@ -0,0 +1,18 @@ +#![deny(unreachable_code)] +#![allow(dead_code)] + +#![feature(never_type)] + +fn foo(x: !) -> bool { + // Explicit matches on the never type are unwarned. + match x {} + // But matches in unreachable code are warned. + match x {} //~ ERROR: unreachable expression +} + +fn main() { + return; + match () { //~ ERROR: unreachable expression + () => (), + } +} diff --git a/src/test/ui/unreachable/unwarned-match-on-never.stderr b/src/test/ui/unreachable/unwarned-match-on-never.stderr new file mode 100644 index 000000000000..969c24a07e83 --- /dev/null +++ b/src/test/ui/unreachable/unwarned-match-on-never.stderr @@ -0,0 +1,22 @@ +error: unreachable expression + --> $DIR/unwarned-match-on-never.rs:10:5 + | +LL | match x {} //~ ERROR: unreachable expression + | ^^^^^^^^^^ + | +note: lint level defined here + --> $DIR/unwarned-match-on-never.rs:1:9 + | +LL | #![deny(unreachable_code)] + | ^^^^^^^^^^^^^^^^ + +error: unreachable expression + --> $DIR/unwarned-match-on-never.rs:15:5 + | +LL | / match () { //~ ERROR: unreachable expression +LL | | () => (), +LL | | } + | |_____^ + +error: aborting due to 2 previous errors +