This PR fixes a panic in `getEqnsFor?` when called on matchers generated from match expressions in theorem types. When a theorem's type contains a match expression (e.g., `theorem bar : (match ... with ...) = 0`), the compiler generates a matcher like `bar.match_1`. Calling `getEqnsFor?` on this matcher would panic with: ``` PANIC: duplicate normalized declaration name bar.match_1.eq_1 vs. _private...bar.match_1.eq_1 ``` This also affected the `try?` tactic, which internally uses `getEqnsFor?`. We make `shouldGenerateEqnThms` return `false` for matchers, since their equations are already generated separately by `Lean.Meta.Match.MatchEqs`. This prevents the equation generation machinery from attempting to create duplicate equation theorems. Closes #11461 Closes #10390 🤖 Prepared with Claude Code Co-authored-by: Claude <noreply@anthropic.com>
35 lines
1.1 KiB
Text
35 lines
1.1 KiB
Text
import Lean
|
|
|
|
/-!
|
|
# Regression test: getEqnsFor? should not panic on matchers
|
|
|
|
Previously, when a theorem had a match expression in its type (e.g. `bar.match_1`),
|
|
calling `getEqnsFor?` on the matcher would panic with "duplicate normalized declaration name".
|
|
|
|
This was fixed by making `shouldGenerateEqnThms` return `false` for matchers, since
|
|
matcher equations are handled separately by `Lean.Meta.Match.MatchEqs`.
|
|
-/
|
|
|
|
-- A theorem with a match expression in its type creates a matcher `bar.match_1`
|
|
theorem bar : (match (0 : Nat) with | 0 => 0 | _ => 1) = 0 := by native_decide
|
|
|
|
-- getEqnsFor? on a matcher should return none (not panic)
|
|
/-- info: eqns: none -/
|
|
#guard_msgs in
|
|
#eval do
|
|
let eqns ← Lean.Meta.getEqnsFor? `bar.match_1
|
|
IO.println s!"eqns: {eqns}"
|
|
|
|
-- try? should not panic when encountering matchers in the goal
|
|
-- (it may fail to find suggestions, but should not panic)
|
|
/--
|
|
info: Try these:
|
|
[apply] rfl
|
|
[apply] simp
|
|
[apply] simp only
|
|
[apply] grind
|
|
[apply] grind only
|
|
[apply] simp_all
|
|
-/
|
|
#guard_msgs in
|
|
theorem bar' : (match (0 : Nat) with | 0 => 0 | _ => 1) = 0 := by try?
|