diff --git a/src/Lean/Elab/Tactic/Do/VCGen/Basic.lean b/src/Lean/Elab/Tactic/Do/VCGen/Basic.lean index 031f9be54206..73b88aa0de54 100644 --- a/src/Lean/Elab/Tactic/Do/VCGen/Basic.lean +++ b/src/Lean/Elab/Tactic/Do/VCGen/Basic.lean @@ -92,6 +92,7 @@ def ifOutOfFuel (x : VCGenM α) (k : VCGenM α) : VCGenM α := do | _ => k def addSubGoalAsVC (goal : MVarId) : VCGenM PUnit := do + goal.freshenLCtxUserNamesSinceIdx (← read).initialCtxSize let ty ← goal.getType if ty.isAppOf ``Std.Do.Invariant then modify fun s => { s with invariants := s.invariants.push goal } @@ -99,10 +100,9 @@ def addSubGoalAsVC (goal : MVarId) : VCGenM PUnit := do modify fun s => { s with vcs := s.vcs.push goal } def emitVC (subGoal : Expr) (name : Name) : VCGenM Expr := do - withFreshUserNamesSinceIdx (← read).initialCtxSize do - let m ← liftM <| mkFreshExprSyntheticOpaqueMVar subGoal (tag := name) - addSubGoalAsVC m.mvarId! - return m + let m ← liftM <| mkFreshExprSyntheticOpaqueMVar subGoal (tag := name) + addSubGoalAsVC m.mvarId! + return m def liftSimpM (x : SimpM α) : VCGenM α := do let ctx ← read diff --git a/src/Lean/Meta/Basic.lean b/src/Lean/Meta/Basic.lean index 6bc9ee7e0f66..a5e1940d1d42 100644 --- a/src/Lean/Meta/Basic.lean +++ b/src/Lean/Meta/Basic.lean @@ -1968,14 +1968,14 @@ def withErasedFVars [MonadLCtx n] [MonadLiftT MetaM n] (fvarIds : Array FVarId) /-- Ensures that the user names of all local declarations after index `idx` have a macro scope. -/ -def withFreshUserNamesSinceIdx [MonadLCtx n] [MonadLiftT MetaM n] (idx : Nat) (k : n α) : n α := do - let mut lctx ← getLCtx +private def freshenUserNamesSinceIdx [MonadLiftT MetaM n] (lctx : LocalContext) (idx : Nat) : n LocalContext := do + let mut lctx := lctx for i in [idx:lctx.numIndices] do let some decl := lctx.decls[i]! | continue let n := decl.userName if !n.hasMacroScopes then lctx := lctx.setUserName decl.fvarId (← liftMetaM <| mkFreshUserName n) - withLCtx' lctx k + return lctx private def withMVarContextImp (mvarId : MVarId) (x : MetaM α) : MetaM α := do let mvarDecl ← mvarId.getDecl @@ -2013,6 +2013,14 @@ def withoutModifyingMCtx : n α → n α := finally modify fun s => { s with cache, mctx } +/-- +Ensures that the user names of all local declarations after index `idx` have a macro scope. +-/ +def _root_.Lean.MVarId.freshenLCtxUserNamesSinceIdx [MonadMCtx n] [MonadLiftT MetaM n] (mvarId : MVarId) (idx : Nat) : n Unit := do + let some decl := (← getMCtx).findDecl? mvarId | liftMetaM <| throwError m!"unknown metavariable {mvarId.name}" + let lctx ← freshenUserNamesSinceIdx decl.lctx idx + modifyMCtx fun mctx => { mctx with decls := mctx.decls.insert mvarId { decl with lctx } } + @[inline] private def approxDefEqImp (x : MetaM α) : MetaM α := withConfig (fun config => { config with foApprox := true, ctxApprox := true, quasiPatternApprox := true}) x