module EtaBug where

record ⊤ : Set where
data ⊥ : Set where

data Bool : Set where
  true  : Bool
  false : Bool

T : Bool → Set
T true  = ⊤
T false = ⊥

record ∃ {A : Set} (B : A → Set) : Set where
  constructor _,_
  field
    proj₁ : A
    proj₂ : B proj₁

postulate
  G : Set → Set
  D : ∀ {A} → G A → A → Set

P : {A : Set} → G A → Set
P g = ∀ x → D g x

postulate
  f : ∀ {A} {g : G A} → P g → P g
  g : (p : ⊥ → Bool) → G (∃ λ t → T (p t))
  h : ∀ {p : ⊥ → Bool} {t pt} → D (g p) (t , pt)
  p : ⊥ → Bool

works : P (g p)
works = f (λ _ → h {p = p})

fails : P (g p)
fails = f (λ _ → h)
