Skip to content

Commit

Permalink
fix: issue when matching Int literals (#3504)
Browse files Browse the repository at this point in the history
  • Loading branch information
leodemoura authored Feb 26, 2024
1 parent 992000a commit 17fb866
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
14 changes: 13 additions & 1 deletion src/Lean/Meta/Match/Match.lean
Original file line number Diff line number Diff line change
Expand Up @@ -165,9 +165,21 @@ private def isNatValueTransition (p : Problem) : MetaM Bool := do
unless (← hasNatValPattern p) do return false
return hasCtorOrInaccessible p

/--
Predicate for testing whether we need to expand `Int` value patterns into constructors.
There are two cases:
- We have constructor or inaccessible patterns. Example:
```
| 0, ...
| Int.toVal p, ...
...
```
- We don't have the `else`-case (i.e., variable pattern). This can happen
when the non-value cases are unreachable.
-/
private def isIntValueTransition (p : Problem) : MetaM Bool := do
unless (← hasIntValPattern p) do return false
return hasCtorOrInaccessible p
return hasCtorOrInaccessible p || !hasVarPattern p

private def processSkipInaccessible (p : Problem) : Problem := Id.run do
let x :: xs := p.vars | unreachable!
Expand Down
12 changes: 12 additions & 0 deletions tests/lean/run/match_int_lit_issue.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
theorem Int.eq_zero_of_sign_eq_zero' : ∀ {a : Int}, sign a = 0 → a = 0
| 0, _ => rfl

def foo (a : Int) : Bool :=
match a with
| Int.ofNat 0 => true
| Int.ofNat 1 => true
| _ => false

example : ∀ {a : Int}, foo a = true → a = 0 ∨ a = 1
| 0, _ => Or.inl rfl
| 1, _ => Or.inr rfl

0 comments on commit 17fb866

Please sign in to comment.