diff --git a/src/Lean/Environment.lean b/src/Lean/Environment.lean index a31ca15bdf..541553de9b 100644 --- a/src/Lean/Environment.lean +++ b/src/Lean/Environment.lean @@ -2081,6 +2081,16 @@ where replayKernel (exts : Array (EnvExtension EnvExtensionState)) (consts : List AsyncConst) (kenv : Kernel.Environment) : Except Kernel.Exception Kernel.Environment := do let mut kenv := kenv + -- replay extensions first in case kernel checking needs them (`IR.declMapExt`) + for ext in exts do + if let some replay := ext.replay? then + kenv := { kenv with + -- safety: like in `modifyState`, but that one takes an elab env instead of a kernel env + extensions := unsafe (ext.modifyStateImpl kenv.extensions <| + replay + (ext.getStateImpl oldEnv.toKernelEnv.extensions) + (ext.getStateImpl newEnv.toKernelEnv.extensions) + (consts.map (·.constInfo.name))) } for c in consts do if skipExisting && (kenv.find? c.constInfo.name).isSome then continue @@ -2102,15 +2112,6 @@ where -- realized kernel additions cannot be interrupted - which would be bad anyway as they can be -- reused between snapshots kenv ← ofExcept <| kenv.addDeclCore 0 decl none - for ext in exts do - if let some replay := ext.replay? then - kenv := { kenv with - -- safety: like in `modifyState`, but that one takes an elab env instead of a kernel env - extensions := unsafe (ext.modifyStateImpl kenv.extensions <| - replay - (ext.getStateImpl oldEnv.toKernelEnv.extensions) - (ext.getStateImpl newEnv.toKernelEnv.extensions) - (consts.map (·.constInfo.name))) } return kenv /-- Like `evalConst`, but first check that `constName` indeed is a declaration of type `typeName`. diff --git a/tests/lean/run/replayConst.lean b/tests/lean/run/replayConst.lean new file mode 100644 index 0000000000..b55a747f10 --- /dev/null +++ b/tests/lean/run/replayConst.lean @@ -0,0 +1,15 @@ +import Lean.Elab.Tactic.Basic +import Std.Tactic.BVDecide + +/-! `replayConst` should be able to replay constants using `native_decide`. -/ + +open Lean Lean.Meta Lean.Elab.Tactic in +elab "replay" ts:tacticSeq : tactic => do + let initEnv ← getEnv + evalTactic ts + let finalState ← saveState + setEnv $ ← initEnv.replayConsts initEnv finalState.term.meta.core.env + +theorem test + (x y : BitVec 128) (h : y = x) : x = y := by + replay bv_decide