This PR gives a simpler semantics to `noncomputable`, improving predictability as well as preparing codegen to be moved into a separate build step without breaking immediate generation of error messages. Specifically, `noncomputable` is now needed whenever an axiom or another `noncomputable` def is used by a def except for the following special cases: * uses inside proofs, types, type formers, and constructor arguments corresponding to (fixed) inductive parameters are ignored * uses of functions marked `@[extern]/@[implemented_by]/@[csimp]` are ignored * for applications of a function marked `@[macro_inline]`, noncomputability of the inlining is instead inspected # Breaking change After this change, more `noncomputable` annotations than before may be required in exchange for improved future stability.
6 lines
185 B
Text
6 lines
185 B
Text
def foo : Squash (Unit → Bool) := .mk fun _ => false
|
|
|
|
def bar : Squash Bool := foo.lift fun f => .mk !f ()
|
|
|
|
set_option trace.Compiler.result true in
|
|
#eval unsafeCast (β := Bool) bar
|