Skip to content

Commit

Permalink
Auto merge of #55119 - varkor:unwarned-match-on-never, r=nikomatsakis
Browse files Browse the repository at this point in the history
Allow explicit matches on ! without warning

It's now possible to explicitly match on `!` without an unreachable code warning. This seems desirable as promoting explicitness.

Fixes #55116.
  • Loading branch information
bors committed Oct 20, 2018
2 parents ca2639e + 2634646 commit 22cc2ae
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 54 deletions.
11 changes: 6 additions & 5 deletions src/librustc_typeck/check/_match.rs
Original file line number Diff line number Diff line change
Expand Up @@ -608,19 +608,20 @@ 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);
return tcx.types.never;
}

if self.diverges.get().always() {
for arm in arms {
self.warn_if_unreachable(arm.body.id, arm.body.span, "arm");
}
}

// 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);

Expand Down

This file was deleted.

This file was deleted.

6 changes: 0 additions & 6 deletions src/test/ui/reachable/expr_match.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,6 @@
#![allow(dead_code)]
#![deny(unreachable_code)]

fn a() {
// The match is considered unreachable here, because the `return`
// diverges:
match {return} { } //~ ERROR unreachable
}

fn b() {
match () { () => return }
println!("I am dead");
Expand Down
19 changes: 6 additions & 13 deletions src/test/ui/reachable/expr_match.stderr
Original file line number Diff line number Diff line change
@@ -1,30 +1,23 @@
error: unreachable expression
--> $DIR/expr_match.rs:19:5
error: unreachable statement
--> $DIR/expr_match.rs:18:5
|
LL | match {return} { } //~ ERROR unreachable
| ^^^^^^^^^^^^^^^^^^
LL | println!("I am dead");
| ^^^^^^^^^^^^^^^^^^^^^^
|
note: lint level defined here
--> $DIR/expr_match.rs:14:9
|
LL | #![deny(unreachable_code)]
| ^^^^^^^^^^^^^^^^

error: unreachable statement
--> $DIR/expr_match.rs:24:5
|
LL | println!("I am dead");
| ^^^^^^^^^^^^^^^^^^^^^^
|
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

error: unreachable statement
--> $DIR/expr_match.rs:35:5
--> $DIR/expr_match.rs:29:5
|
LL | println!("I am dead");
| ^^^^^^^^^^^^^^^^^^^^^^
|
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

error: aborting due to 3 previous errors
error: aborting due to 2 previous errors

24 changes: 24 additions & 0 deletions src/test/ui/unreachable/unwarned-match-on-never.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#![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 bar() {
match (return) {
() => () //~ ERROR unreachable arm
}
}

fn main() {
return;
match () { //~ ERROR unreachable expression
() => (),
}
}
28 changes: 28 additions & 0 deletions src/test/ui/unreachable/unwarned-match-on-never.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
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 arm
--> $DIR/unwarned-match-on-never.rs:15:15
|
LL | () => () //~ ERROR unreachable arm
| ^^

error: unreachable expression
--> $DIR/unwarned-match-on-never.rs:21:5
|
LL | / match () { //~ ERROR unreachable expression
LL | | () => (),
LL | | }
| |_____^

error: aborting due to 3 previous errors

0 comments on commit 22cc2ae

Please sign in to comment.