Skip to content

Commit c4ca49a

Browse files
authored
Rollup merge of rust-lang#55819 - pnkfelix:issue-55810-must-typeck-pats-eagerly, r=oli-obk
Typecheck patterns of all match arms first, so we get types for bindings Fix eventually (after backport to beta) the issue rust-lang#55810
2 parents e8a3934 + 5f91373 commit c4ca49a

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

src/librustc_typeck/check/_match.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -626,9 +626,9 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
626626
let discrim_diverges = self.diverges.get();
627627
self.diverges.set(Diverges::Maybe);
628628

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

649649
// Now typecheck the blocks.
650650
//
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// compile-pass
2+
3+
// rust-lang/rust#55810: types for a binding in a match arm can be
4+
// inferred from arms that come later in the match.
5+
6+
struct S;
7+
8+
impl S {
9+
fn method(&self) -> bool {
10+
unimplemented!()
11+
}
12+
}
13+
14+
fn get<T>() -> T {
15+
unimplemented!()
16+
}
17+
18+
fn main() {
19+
match get() {
20+
x if x.method() => {}
21+
&S => {}
22+
}
23+
}

0 commit comments

Comments
 (0)