lean4-htt/tests/lean/run/7170.lean
jrr6 62f14514da
refactor: update built-in tactic error messages (#9633)
This PR updates various error messages produced by or associated with
built-in tactics and adapts their formatting to current conventions.
2025-07-31 14:16:57 +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