// FIR_IDENTICAL
// TARGET_BACKEND: JVM
// WITH_STDLIB
// OPT_IN: kotlin.experimental.ExperimentalTypeInference

import kotlin.experimental.ExperimentalTypeInference

fun <E> produce(block: Derived<E>.() -> Unit): E = null as E

interface Derived<in E> : Base<E>

interface Base<in E>

interface Receiver<out E>

fun <E, C : Base<E>> Receiver<E>.toChannel(destination: C): C = null as C

fun <R> foo(r: Receiver<R>): R = produce { r.toChannel(this) }

fun box() = "OK"
