open class VeryBase { protected fun baz() {} } open class Base { protected fun foo() { bar() // Ok baz() // Ok } inner class Inner { fun fromInner() { foo() // Ok bar() // Ok gav() // Ok baz() // Ok } } class NestedDerived : Base() { fun fromNestedDerived() { foo() // Ok bar() // Ok gav() // Ok baz() // Ok } } companion object : VeryBase() { var prop = 42 protected set protected fun bar() {} @JvmStatic protected fun gav() {} class Nested { fun fromNested() { bar() // Ok gav() // Ok } } } } class Derived : Base() { fun test() { foo() // Ok gav() // Ok bar() baz() prop = 0 } inner class DerivedInner { fun fromDerivedInner() { foo() // Ok gav() // Ok bar() baz() prop = 0 } } companion object { fun test2() { gav() // Ok bar() baz() prop = 0 } } } class Other { fun test(base: Base, derived: Derived) { base.foo() base.gav() base.bar() derived.foo() derived.gav() derived.bar() } } fun top(base: Base, derived: Derived) { base.foo() base.bar() base.gav() derived.foo() derived.bar() derived.gav() }