Rollup merge of #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 #55810
This commit is contained in:
commit
c4ca49aebd
@ -626,9 +626,9 @@ pub fn check_match(&self,
|
||||
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);
|
||||
@ -644,7 +644,7 @@ pub fn check_match(&self,
|
||||
Diverges::Maybe => Diverges::Maybe,
|
||||
Diverges::Always | Diverges::WarnedAlways => Diverges::WarnedAlways,
|
||||
}
|
||||
});
|
||||
}).collect();
|
||||
|
||||
// Now typecheck the blocks.
|
||||
//
|
||||
|
@ -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 => {}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user