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.
218 lines
4.7 KiB
Text
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
|