structure A :=
(a : Nat)

structure B :=
(a : Nat)

structure C :=
(a : Nat)

instance : Coe A B := ⟨fun s => ⟨s.1⟩⟩

instance : Coe A C := ⟨fun s => ⟨s.1⟩⟩

def f {α} (a b : α) := a
def forceB {α} (b : B) (a : α) := a
def forceC {α} (c : C) (a : α) := a
def forceA {α} (a : A) (o : α) := o

def f1 (x : _) (y : _) (z : _) :=
let a1 := f x y;
let a2 := f y z;
forceB x a1 -- works

def f2 (x : _) (y : _) (z : _) :=
let a1 := f x ↑y;
let a2 := f ↑y z;
forceB x (forceC z (forceA y (a1, a2))) -- works because we manually added the coercions above

#exit

def f3 (x : _) (y : _) (z : _) :=
let a1 := f x y;
let a2 := f y z;
/- Fails because we "missed" the opportunity to insert coercions around `y`.
   I think we should **not** support this kind of example. -/
forceB x (forceC z (forceA y (a1, a2)))
