Skip to content

Commit

Permalink
Typecheck patterns of all match arms first, so we get types for bindi…
Browse files Browse the repository at this point in the history
…ngs.
  • Loading branch information
pnkfelix committed Nov 12, 2018
1 parent 9142ac9 commit 1c0cc97
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/librustc_typeck/check/_match.rs
Original file line number Diff line number Diff line change
Expand Up @@ -626,9 +626,9 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
let discrim_diverges = self.diverges.get();
self.diverges.set(Diverges::Maybe);

// Typecheck the patterns first, so that we get types for all the
// bindings.
let all_arm_pats_diverge = arms.iter().map(|arm| {
// rust-lang/rust#55810: Typecheck patterns first (via eager
// collection into `Vec`), so we get types for all bindings.
let all_arm_pats_diverge: Vec<_> = arms.iter().map(|arm| {
let mut all_pats_diverge = Diverges::WarnedAlways;
for p in &arm.pats {
self.diverges.set(Diverges::Maybe);
Expand All @@ -644,7 +644,7 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
Diverges::Maybe => Diverges::Maybe,
Diverges::Always | Diverges::WarnedAlways => Diverges::WarnedAlways,
}
});
}).collect();

// Now typecheck the blocks.
//
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// compile-pass

// rust-lang/rust#55810: types for a binding in a match arm can be
// inferred from arms that come later in the match.

struct S;

impl S {
fn method(&self) -> bool {
unimplemented!()
}
}

fn get<T>() -> T {
unimplemented!()
}

fn main() {
match get() {
x if x.method() => {}
&S => {}
}
}

0 comments on commit 1c0cc97

Please sign in to comment.