Compare commits

...

1 Commits

Author SHA1 Message Date
Leonardo de Moura
8797e89324 fix: ensure a local instance is not registered multiple times
closes #4203
2024-05-17 18:34:25 -07:00
2 changed files with 31 additions and 1 deletions

View File

@@ -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

28
tests/lean/run/4203.lean Normal file
View File

@@ -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