This PR improves the error message encountered in the case of a type class instance resolution failure, and adds an error explanation that discusses the common new-user case of binary operation overloading and points to the `trace.Meta.synthInstance` option for advanced debugging. ## Example ```lean4 def f (x : String) := x + x ``` Before: ``` failed to synthesize HAdd String String ?m.5 Hint: Additional diagnostic information may be available using the `set_option diagnostics true` command. ``` After: ``` failed to synthesize instance of type class HAdd String String ?m.5 Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command. Error code: lean.failedToSynthesizeTypeclassInstance [View explanation](https://lean-lang.org/doc/reference/latest/find/?domain=Manual.errorExplanation&name=lean.failedToSynthesizeTypeclassInstance) ``` The error message is changed in three important ways: * Explains *what* failed to synthesize, using the "type class" terminology that's more likely to be recognized than the "instance" terminology * Points to the `trace.Meta.synthInstance` option which is otherwise nearly undiscoverable but is quite powerful (see also leanprover/reference-manual#663 which is adding commentary on this option) * Gives an error explanation link (which won't actually work until the next release after this is merged) which prioritizes the common-case explanation of using the wrong binary operation
27 lines
870 B
Text
27 lines
870 B
Text
macroStack.lean:4:5-4:6: error(lean.unknownIdentifier): Unknown identifier `x`
|
|
macroStack.lean:8:6-8:7: error: Unknown identifier `x`
|
|
with resulting expansion
|
|
binrel% GT.gt✝ x 0
|
|
while expanding
|
|
x > 0
|
|
while expanding
|
|
(x > 0)
|
|
while expanding
|
|
if h : (x > 0) then 1 else 0
|
|
macroStack.lean:11:9-11:15: error: invalid use of `(<- ...)`, must be nested inside a 'do' expression
|
|
macroStack.lean:17:0-17:6: error: failed to synthesize instance of type class
|
|
HAdd Nat String ?m
|
|
|
|
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
|
|
with resulting expansion
|
|
binop% HAdd.hAdd✝ (x + x✝) x✝¹
|
|
while expanding
|
|
(x + x✝) + x✝¹
|
|
while expanding
|
|
foo!(x + x✝)
|
|
while expanding
|
|
foo!(x + x✝) < 1
|
|
while expanding
|
|
if foo!(x + x✝) < 1 then true✝ else false✝
|
|
while expanding
|
|
bla! x
|