This PR improves the error message when `initialize` (or `opaque`) fails to find an `Inhabited` or `Nonempty` instance. **Before:** ``` failed to synthesize Inhabited Foo ``` **After:** ``` failed to synthesize 'Inhabited' or 'Nonempty' instance for Foo If this type is defined using the 'structure' or 'inductive' command, you can try adding a 'deriving Nonempty' clause to it. ``` Prompted by https://leanprover.zulipchat.com/#narrow/channel/270676-lean4/topic/initialize.20structure.20with.20IO.2ERef/near/564936030 🤖 Prepared with Claude Code --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
27 lines
1.5 KiB
Text
27 lines
1.5 KiB
Text
sanitychecks.lean:1:8-1:15: error: fail to show termination for
|
|
unsound
|
|
with errors
|
|
failed to infer structural recursion:
|
|
no parameters suitable for structural recursion
|
|
|
|
well-founded recursion cannot be used, `unsound` does not take any (non-fixed) arguments
|
|
sanitychecks.lean:4:8-4:32: error: 'partial' theorems are not allowed, 'partial' is a code generation directive
|
|
sanitychecks.lean:7:7-7:31: error: 'unsafe' theorems are not allowed
|
|
sanitychecks.lean:10:0-10:23: error: failed to synthesize 'Inhabited' or 'Nonempty' instance for
|
|
False
|
|
|
|
If this type is defined using the 'structure' or 'inductive' command, you can try adding a 'deriving Nonempty' clause to it.
|
|
sanitychecks.lean:18:12-18:20: error: invalid use of `partial`, `Foo.unsound3` is not a function
|
|
False
|
|
sanitychecks.lean:20:0-20:54: error: failed to compile 'partial' definition `Foo.unsound4`, could not prove that the type
|
|
∀ (x : Unit), False
|
|
is nonempty.
|
|
|
|
This process uses multiple strategies:
|
|
- It looks for a parameter that matches the return type.
|
|
- It tries synthesizing 'Inhabited' and 'Nonempty' instances for the return type, while making every parameter into a local 'Inhabited' instance.
|
|
- It tries unfolding the return type.
|
|
|
|
If the return type is defined using the 'structure' or 'inductive' command, you can try adding a 'deriving Nonempty' clause to it.
|
|
sanitychecks.lean:22:12-22:20: error: (kernel) invalid declaration, it uses unsafe declaration 'unsafeCast'
|
|
sanitychecks.lean:25:12-25:20: error: (kernel) invalid declaration, it uses unsafe declaration 'unsafeCast'
|