interface EffectivelyOut { fun foo(): T val bar: T } interface EffectivelyIn { fun foo(arg: T) } interface Invariant1 { var bar: T } interface Invariant2 { fun T.foo(): T } interface Invariant3> { fun T.foo() } abstract class AbstractOut { abstract val foo: T private var bar = foo } abstract class AbstractIn(private val foo: T) { fun bar(arg: T) = foo == arg } interface Empty // here we do not report anything to avoid ambiguity abstract class AbstractInv(var foo: T) class InvUser(val user: AbstractInv)