| set_option trace.compiler.ir.result true | |
| -- All generated case and ctor instructions should use the _impl version | |
| inductive Exp | |
| | var (i : UInt32) | |
| | app (a b : Exp) | |
| | a1 | |
| | a2 | |
| | a3 | |
| | a4 | |
| | a5 | |
| with | |
| @[computed_field] hash : Exp → UInt64 | |
| | .var i => Hashable.hash i + 1000 | |
| | .app a b => mixHash (hash a) (hash b) | |
| | _ => 42 | |
| def f := Exp.hash (.app (.var 10) .a4) | |
| -- should use 'default →' case | |
| def g : Exp → Bool | |
| | .a3 => true | |
| | _ => false | |
| -- using the same matcher as in the computed field should work | |
| def hash' : Exp → Nat | |
| | .var i => i.toNat | |
| | .app a b => hash' a + hash' b | |
| | _ => 42 | |
| -- should not invoke Exp.var._override | |
| def getAppFn : Exp → Exp | |
| | .app f _ => getAppFn f | |
| | e => e | |
| -- should not call Exp.app._override | |
| def Exp.f (e : Exp) : Exp := | |
| match app e e with | |
| | var _ => e | |
| | app a _ => getAppFn a | |
| | e => e |