/-! # Make sure local instance detection can handle metavariables and other reductions -/ /-! Reported in https://github.com/leanprover/lean4/issues/2199 The `inferInstance` was failing due to metavariables introduced by `cases`. -/ theorem exists_foo : ∃ T : Type, Nonempty T := ⟨Unit, ⟨()⟩⟩ example : True := by cases exists_foo rename_i T hT have : Nonempty T := inferInstance trivial /-! The `let` would inhibit `inst` from being seen as a local `Decidable` instance. Two tests: one where `let` starts a telescope, and another where it's at the end. (Having `let`s in the middle of a forall telescope always worked.) -/ axiom p : Nat → Prop axiom inst : let n := 5; Decidable (p n) example : True := by have := inst have : Decidable (p 5) := inferInstance trivial axiom inst' : ∀ k, let n := k; Decidable (p n) example : True := by have := inst' have : Decidable (p 5) := inferInstance trivial /-! This worked before, but here's an extra test that abbreviations are correctly handled. -/ abbrev D (p : Prop) := Decidable p example (p : Prop) [D p] : (if p then True else False) ↔ p := by split <;> simp_all