import Lean open Lean set_option backward.do.legacy false -- only fixed in the new do elaborator structure Foo (n : Nat) where (l : List Nat) (h : n = n) def foo (n : Nat) : MetaM Unit := do let mut result : Foo n := ⟨[7], rfl⟩ trace[Meta.Tactic.simp] "{result.l}" result := ⟨List.range n, rfl⟩ trace[Meta.Tactic.simp] "{result.l}" match n with | _ => trace[Meta.Tactic.simp] "{result.l}" set_option trace.Meta.Tactic.simp true /-- trace: [Meta.Tactic.simp] [7] [Meta.Tactic.simp] [0, 1, 2, 3, 4] [Meta.Tactic.simp] [0, 1, 2, 3, 4] -/ #guard_msgs in run_meta do foo 5 def bar (n : Nat) : MetaM (List Nat) := do let mut result : Foo n := ⟨[7], rfl⟩ trace[Meta.Tactic.simp] "{result.l}" result := ⟨List.range n, rfl⟩ trace[Meta.Tactic.simp] "{result.l}" have : Foo n := ⟨[7], rfl⟩ match n with | 0 => pure (); result := ⟨[10], rfl⟩ | _+1 => result := ⟨[6], rfl⟩ trace[Meta.Tactic.simp] "{result.l}" return result.l set_option trace.Meta.Tactic.simp true /-- trace: [Meta.Tactic.simp] [7] [Meta.Tactic.simp] [] [Meta.Tactic.simp] [10] [Meta.Tactic.simp] [7] [Meta.Tactic.simp] [0, 1, 2, 3, 4] [Meta.Tactic.simp] [6] -/ #guard_msgs in run_meta do discard <| bar 0 discard <| bar 5