diff --git a/src/Lean/Meta/Basic.lean b/src/Lean/Meta/Basic.lean index 9434ae08a4..cacf95f420 100644 --- a/src/Lean/Meta/Basic.lean +++ b/src/Lean/Meta/Basic.lean @@ -1446,7 +1446,9 @@ def withLocalInstancesImp (decls : List LocalDecl) (k : MetaM α) : MetaM α := for decl in decls do unless decl.isImplementationDetail do if let some className ← isClass? decl.type then - localInsts := localInsts.push { className, fvar := decl.toExpr } + -- Ensure we don't add the same local instance multiple times. + unless localInsts.any fun localInst => localInst.fvar.fvarId! == decl.fvarId do + localInsts := localInsts.push { className, fvar := decl.toExpr } if localInsts.size == size then k else diff --git a/tests/lean/run/4203.lean b/tests/lean/run/4203.lean new file mode 100644 index 0000000000..86caf423e4 --- /dev/null +++ b/tests/lean/run/4203.lean @@ -0,0 +1,28 @@ +class Fintype (α : Type u) where + +class Preorder (α : Type u) extends LT α, LE α where + lt := fun a b => a ≤ b ∧ ¬b ≤ a + +structure Mappish (dIn dOut : Type u) [Fintype dIn] [Fintype dOut] where + k : Nat + +variable {dIn dOut dOut₂ : Type} [Fintype dIn] [Fintype dOut] [Fintype dOut₂] + +def IsGood [DecidableEq dOut] [DecidableEq dOut₂] (Λ : Mappish dIn dOut) (Λ₂ : Mappish dIn dOut₂) : Prop := + ∃ (D : Mappish dOut (dOut₂)), D.k = Λ.k + Λ₂.k + +/-- +error: failed to synthesize + Fintype v +use `set_option diagnostics true` to get diagnostic information +-/ +#guard_msgs in +def MappishOrder [DecidableEq dIn] : Preorder + (Σ dOut : Sigma (fun t ↦ Fintype t × DecidableEq t), let fin := dOut.snd.1; Mappish dIn dOut.fst) where + le Λ₁ Λ₂ := by + let u := Λ₁.fst.fst; + let v := Λ₂.fst.fst; + let ⟨w,x⟩ := Λ₁.fst.snd; + let ⟨y,z⟩ := Λ₂.fst.snd; + clear y; + exact @IsGood dIn v u _ _ _ _ _ Λ₂.snd Λ₁.snd