FILE: genericOverloads.kt
    public open class A : R|kotlin/Any| {
        public constructor(): R|A| {
            super<R|kotlin/Any|>()
        }

    }
    public open class B : R|A| {
        public constructor(): R|B| {
            super<R|A|>()
        }

    }
    public final class C : R|B| {
        public constructor(): R|C| {
            super<R|B|>()
        }

    }
    public abstract interface I1 : R|kotlin/Any| {
    }
    public abstract interface I2 : R|kotlin/Any| {
    }
    public final class Merge : R|I1|, R|I2| {
        public constructor(): R|Merge| {
            super<R|kotlin/Any|>()
        }

    }
    public final class Box<out T> : R|kotlin/Any| {
        public constructor<out T>(): R|Box<T>| {
            super<R|kotlin/Any|>()
        }

    }
    context(a: R|T|)
    public final fun <T : R|B|> foo0a(): R|kotlin/Boolean| {
        ^foo0a Boolean(true)
    }
    context(a: R|A|)
    public final fun foo0a(): R|kotlin/String| {
        ^foo0a String()
    }
    public final fun <T : R|B|> foo0b(a: R|T|): R|kotlin/Boolean| {
        ^foo0b Boolean(true)
    }
    context(a: R|A|)
    public final fun foo0b(): R|kotlin/String| {
        ^foo0b String()
    }
    context(a: R|T|)
    public final fun <T : R|B|> foo0c(): R|kotlin/Boolean| {
        ^foo0c Boolean(true)
    }
    public final fun foo0c(a: R|A|): R|kotlin/String| {
        ^foo0c String()
    }
    context(a: R|T|)
    public final fun <T : R|B|> foo1a(): R|kotlin/Boolean| {
        ^foo1a Boolean(true)
    }
    context(a: R|T|)
    public final fun <T> foo1a(): R|kotlin/String| {
        ^foo1a String()
    }
    public final fun <T : R|B|> foo1b(a: R|T|): R|kotlin/Boolean| {
        ^foo1b Boolean(true)
    }
    context(a: R|T|)
    public final fun <T> foo1b(): R|kotlin/String| {
        ^foo1b String()
    }
    context(a: R|T|)
    public final fun <T : R|B|> foo1c(): R|kotlin/Boolean| {
        ^foo1c Boolean(true)
    }
    public final fun <T> foo1c(a: R|T|): R|kotlin/String| {
        ^foo1c String()
    }
    context(a: R|T|)
    public final fun <T> foo2a(): R|kotlin/Boolean| {
        ^foo2a Boolean(true)
    }
    context(a: R|A|)
    public final fun foo2a(): R|kotlin/String| {
        ^foo2a String()
    }
    public final fun <T> foo2b(a: R|T|): R|kotlin/Boolean| {
        ^foo2b Boolean(true)
    }
    context(a: R|A|)
    public final fun foo2b(): R|kotlin/String| {
        ^foo2b String()
    }
    context(a: R|T|)
    public final fun <T> foo2c(): R|kotlin/Boolean| {
        ^foo2c Boolean(true)
    }
    public final fun foo2c(a: R|A|): R|kotlin/String| {
        ^foo2c String()
    }
    context(a: R|T|)
    public final fun <T : R|I1|> foo3a(): R|kotlin/Boolean| {
        ^foo3a Boolean(true)
    }
    context(a: R|T|)
    public final fun <T : R|I2|> foo3a(): R|kotlin/String| {
        ^foo3a String()
    }
    public final fun <T : R|I1|> foo3b(a: R|T|): R|kotlin/Boolean| {
        ^foo3b Boolean(true)
    }
    context(a: R|T|)
    public final fun <T : R|I2|> foo3b(): R|kotlin/String| {
        ^foo3b String()
    }
    context(a: R|T|)
    public final fun <T : R|I1|> foo3c(): R|kotlin/Boolean| {
        ^foo3c Boolean(true)
    }
    public final fun <T : R|I2|> foo3c(a: R|T|): R|kotlin/String| {
        ^foo3c String()
    }
    context(a: R|Box<T>|)
    public final fun <T : R|B|> foo4a(): R|kotlin/Boolean| {
        ^foo4a Boolean(true)
    }
    context(a: R|Box<A>|)
    public final fun foo4a(): R|kotlin/String| {
        ^foo4a String()
    }
    public final fun <T : R|B|> foo4b(a: R|Box<T>|): R|kotlin/Boolean| {
        ^foo4b Boolean(true)
    }
    context(a: R|Box<A>|)
    public final fun foo4b(): R|kotlin/String| {
        ^foo4b String()
    }
    context(a: R|Box<T>|)
    public final fun <T : R|B|> foo4c(): R|kotlin/Boolean| {
        ^foo4c Boolean(true)
    }
    public final fun foo4c(a: R|Box<A>|): R|kotlin/String| {
        ^foo4c String()
    }
    public final fun test(): R|kotlin/Unit| {
        lval t0a: R|kotlin/Boolean| = context(R|/C.C|()) R|/foo0a|<R|C|>()
        lval t0a_: R|kotlin/String| = context(R|/A.A|()) R|/foo0a|()
        lval t0b: R|kotlin/Boolean| = R|/foo0b|<R|C|>(R|/C.C|())
        lval t0b_: R|kotlin/String| = context(R|/A.A|()) R|/foo0b|()
        lval t0c: R|kotlin/Boolean| = context(R|/C.C|()) R|/foo0c|<R|C|>()
        lval t0c_: R|kotlin/String| = R|/foo0c|(R|/A.A|())
        lval t1a: R|kotlin/Boolean| = context(R|/C.C|()) R|/foo1a|<R|C|>()
        lval t1a_: R|kotlin/String| = context(R|/A.A|()) R|/foo1a|<R|A|>()
        lval t1b: R|kotlin/Boolean| = R|/foo1b|<R|C|>(R|/C.C|())
        lval t1b_: R|kotlin/String| = context(R|/A.A|()) R|/foo1b|<R|A|>()
        lval t1c: R|kotlin/Boolean| = context(R|/C.C|()) R|/foo1c|<R|C|>()
        lval t1c_: R|kotlin/String| = R|/foo1c|<R|A|>(R|/A.A|())
        lval t2a: R|kotlin/String| = context(R|/C.C|()) R|/foo2a|()
        lval t2a_: R|kotlin/String| = context(R|/A.A|()) R|/foo2a|()
        lval t2b: R|kotlin/String| = context(R|/C.C|()) R|/foo2b|()
        lval t2b_: R|kotlin/String| = context(R|/A.A|()) R|/foo2b|()
        lval t2c: R|kotlin/String| = R|/foo2c|(R|/C.C|())
        lval t2c_: R|kotlin/String| = R|/foo2c|(R|/A.A|())
        <Ambiguity: foo3a, [/foo3a, /foo3a]>#(R|/Merge.Merge|())
        <Ambiguity: foo3b, [/foo3b, /foo3b]>#(R|/Merge.Merge|())
        <Ambiguity: foo3c, [/foo3c, /foo3c]>#(R|/Merge.Merge|())
        lval t4a: R|kotlin/Boolean| = context(R|/Box.Box|<R|C|>()) R|/foo4a|<R|C|>()
        lval t4a_: R|kotlin/String| = context(R|/Box.Box|<R|A|>()) R|/foo4a|()
        lval t4b: R|kotlin/Boolean| = R|/foo4b|<R|C|>(R|/Box.Box|<R|C|>())
        lval t4b_: R|kotlin/String| = context(R|/Box.Box|<R|A|>()) R|/foo4b|()
        lval t4c: R|kotlin/Boolean| = context(R|/Box.Box|<R|C|>()) R|/foo4c|<R|C|>()
        lval t4c_: R|kotlin/String| = R|/foo4c|(R|/Box.Box|<R|A|>())
    }
