open class Base { constructor() /* primary */ { super/*Any*/() /* () */ } fun foo(x: T) { } fun foo(y: String) { } val T.bar: Int get(): Int { return 1 } val String.bar: Int get(): Int { return 2 } } open class BaseXY { constructor() /* primary */ { super/*Any*/() /* () */ } fun foo(x: X, y: String) { } fun foo(x: String, y: Y) { } } open class Derived : Base { constructor() /* primary */ { super/*Base*/() /* () */ } } class Derived2 : Derived { constructor() /* primary */ { super/*Derived*/() /* () */ } } class DerivedXY : BaseXY { constructor() /* primary */ { super/*BaseXY*/() /* () */ } } open class Outer { open inner class Inner { constructor() /* primary */ { super/*Any*/() /* () */ } fun foo(x: T) { } fun foo(y: String) { } } constructor() /* primary */ { super/*Any*/() /* () */ } } class OuterDerived : Outer { inner class InnerDerived : Inner { constructor() /* primary */ { .super/*Inner*/() /* () */ } } constructor() /* primary */ { super/*Outer*/() /* () */ } } fun outerFun() { local open class LocalBase { constructor() /* primary */ { super/*Any*/() /* () */ } fun foo(x: T) { } fun foo(y: String) { } val T.bar: Int get(): Int { return 1 } val String.bar: Int get(): Int { return 2 } } local open class LocalDerived : LocalBase { constructor() /* primary */ { super/*LocalBase*/() /* () */ } } local class LocalDerived2 : LocalDerived { constructor() /* primary */ { super/*LocalDerived*/() /* () */ } } local fun test(b: LocalBase, d: LocalDerived, d2: LocalDerived2) { b.foo(x = "") b.foo(y = "") d.foo(x = "") d.foo(y = "") d2.foo(x = "") d2.foo(y = "") } } fun test(b: Base, d: Derived, d2: Derived2) { b.foo(x = "") b.foo(y = "") d.foo(x = "") d.foo(y = "") d2.foo(x = "") d2.foo(y = "") }