Fix missing terminator in pattern matching of consts

This commit is contained in:
hkalbasi 2023-07-10 01:01:59 +03:30
parent aa52cbf784
commit 42d35f8af9
2 changed files with 22 additions and 1 deletions

View File

@ -307,6 +307,11 @@ fn pattern_match_inner(
mode,
)?,
None => {
// The path is not a variant, so it is a const
if mode != MatchingMode::Check {
// A const don't bind anything. Only needs check.
return Ok((current, current_else));
}
let unresolved_name = || MirLowerError::unresolved_path(self.db, p);
let resolver = self.owner.resolver(self.db.upcast());
let pr = resolver
@ -362,8 +367,8 @@ fn pattern_match_inner(
},
Pat::Lit(l) => match &self.body.exprs[*l] {
Expr::Literal(l) => {
let c = self.lower_literal_to_operand(self.infer[pattern].clone(), l)?;
if mode == MatchingMode::Check {
let c = self.lower_literal_to_operand(self.infer[pattern].clone(), l)?;
self.pattern_match_const(current_else, current, c, cond_place, pattern)?
} else {
(current, current_else)

View File

@ -795,6 +795,22 @@ fn main() {
//^^^^^ 💡 warn: variable does not need to be mutable
f(x);
}
"#,
);
check_diagnostics(
r#"
struct Foo(i32);
const X: Foo = Foo(5);
const Y: Foo = Foo(12);
const fn f(mut a: Foo) -> bool {
//^^^^^ 💡 warn: variable does not need to be mutable
match a {
X | Y => true,
_ => false,
}
}
"#,
);
}