interface In<in T : Any?> {

}

interface Inv<T : Any?> {
  abstract val t: T
    abstract get

}

interface Z {
  abstract fun <T : Any?> create(x: In<T>, y: In<T>): Inv<T>

}

interface IA {
  abstract fun foo()

}

interface IB {
  abstract fun bar()

}

fun test(a: In<IA>, b: In<IB>, z: Z) {
  z.create<IA>(x = a, y = b).<get-t>().foo()
  z.create<IA>(x = a, y = b).<get-t>() /*as IB */.bar()
  val t: IA = z.create<IA>(x = a, y = b).<get-t>()
  t.foo()
  t /*as IB */.bar()
}
