lean4-htt/tests/elab/7170.lean
Garmelon 08eb78a5b2
chore: switch to new test/bench suite (#12590)
This PR sets up the new integrated test/bench suite. It then migrates
all benchmarks and some related tests to the new suite. There's also
some documentation and some linting.

For now, a lot of the old tests are left alone so this PR doesn't become
even larger than it already is. Eventually, all tests should be migrated
to the new suite though so there isn't a confusing mix of two systems.
2026-02-25 13:51:53 +00:00

218 lines
4.7 KiB
Text

/-!
# Error messages for matches with incorrect numbers of patterns
https://github.com/leanprover/lean4/issues/7170
Error messages for `match` expressions and definitions by pattern matching where an incorrect or
inconsistent number of patterns are supplied should indicate this issue and should only assert that
a given number of patterns is "incorrect" (rather than merely "inconsistent") when the number of
discriminants has been explicitly specified by the user.
-/
inductive Foo
| foo
| foo2
def correct : Foo → Foo → Prop
| .foo => fun _ => True
| .foo2 => fun _ => False
/--
error: Inconsistent number of patterns in match alternatives: This alternative contains 2 patterns:
.foo2, x
but a preceding alternative contains 1:
.foo
-/
#guard_msgs in
def patCountMismatch : Foo → Foo → Prop
| .foo => fun _ => True
| .foo2, x => False
/--
error: Cannot define a value of type
Nat
by pattern matching because it is not a function type
-/
#guard_msgs in
def badType : Nat
| 0 => 32
/--
error: Too many patterns in match alternative: At most 2 patterns expected in a definition of type ⏎
Foo → Foo → Prop
but found 3:
f₁, f₂, f₃
-/
#guard_msgs in
def tooMany₁ : Foo → Foo → Prop
| f₁, f₂, f₃ => True
/--
error: Too many patterns in match alternative: At most 2 patterns expected in a definition of type ⏎
Foo → Foo → Prop
but found 3:
.foo, .foo, f
-/
#guard_msgs in
def tooMany₂ : Foo → Foo → Prop
| .foo, .foo, f => True
| .foo, .foo2 => True
/--
error: Inconsistent number of patterns in match alternatives: This alternative contains 3 patterns:
.foo, .foo, f
but a preceding alternative contains 2:
.foo, .foo2
-/
#guard_msgs in
def tooMany₃ : Foo → Foo → Prop
| .foo, .foo2 => True
| .foo, .foo, f => True
/--
error: Type mismatch
True
has type
Prop
but is expected to have type
Foo → Prop
-/
#guard_msgs in
def tooFew₁ : Foo → Foo → Prop
| _ => True
/--
error: Inconsistent number of patterns in match alternatives: This alternative contains 2 patterns:
.foo, .foo2
but a preceding alternative contains 1:
.foo
-/
#guard_msgs in
def tooFew₂ : Foo → Foo → Prop
| .foo => False
| .foo, .foo2 => True
/--
error: Inconsistent number of patterns in match alternatives: This alternative contains 1 pattern:
_
but a preceding alternative contains 2:
.foo, .foo
-/
#guard_msgs in
def tooFew₃ : Foo → Foo → Prop
| .foo, .foo => True
| _ => False
/--
error: Inconsistent number of patterns in match alternatives: This alternative contains 1 pattern:
_
but a preceding alternative contains 2:
.foo, .foo
-/
#guard_msgs in
def tooFewFn : Foo → Foo → Prop
| .foo, .foo => True
| _ => fun f => True
def TyVal := Nat → String → Nat
def withTyValOK : TyVal
| x, _ => x
/--
error: Too many patterns in match alternative: At most 2 patterns expected in a definition of type ⏎
TyVal
but found 3:
x, y, z
-/
#guard_msgs in
def withTyValTooMany : TyVal
| x, y, z =>
let x := 34
toString x ++ y ++ z
/--
error: Inconsistent number of patterns in match alternatives: This alternative contains 1 pattern:
_
but a preceding alternative contains 2:
Nat.zero, ""
-/
#guard_msgs in
def noType
| Nat.zero, "" => true
| _ => false
/--
error: Too many patterns in match alternative: Expected 1, but found 2:
.foo, .foo
-/
#guard_msgs in
def matchTooMany₁ (f : Foo) : Nat :=
match f with
| .foo, .foo => 32
| _ => 41
/--
error: Too many patterns in match alternative: Expected 1, but found 2:
.foo2, .foo2
-/
#guard_msgs in
def matchTooMany₂ (f : Foo) : Nat :=
match f with
| .foo => 41
| .foo2, .foo2 => 32
/--
error: Not enough patterns in match alternative: Expected 2, but found 1:
.foo
---
error: Missing cases:
Foo.foo2, Foo.foo
-/
#guard_msgs in
def matchTooFew₁ (f : Foo) : Nat :=
match f, f with
| .foo => 41
| .foo2, .foo2 => 32
/--
error: Not enough patterns in match alternative: Expected 2, but found 1:
.foo
---
error: Missing cases:
Foo.foo2, Foo.foo
-/
#guard_msgs in
def matchTooFew₂ (f : Foo) : Nat :=
match f, f with
| .foo2, .foo2 => 32
| .foo => 41
set_option pp.mvars false in
/--
error: Not enough patterns in match alternative: Expected 2, but found 1:
.(_)
---
error: Type mismatch
fun b => True
has type
?_ → Prop
but is expected to have type
Prop
-/
#guard_msgs in
def matchTooFewFn : Foo → Foo → Prop := fun a b =>
match a, b with
| _ => fun b => True
/--
error: Inconsistent number of patterns in match alternatives: This alternative contains 1 pattern:
n + 1
but a preceding alternative contains 2:
x, 0
-/
#guard_msgs in
def checkCounterexampleMsg : Nat → Nat → Nat
| x, 0 => x
| 0, n + 1 => n
| n + 1 => 42