// MODULE: base // FILE: base1.kt // VERSION: 1 open class X { } // FILE: base2.kt // VERSION: 2 open class X { fun foo() = "non-open member function moved higher" val bar = "non-open member property moved higher" fun nux() = "non-open member function moved higher to cause conflict" val zip = "non-open member property moved higher to cause conflict" open fun ril() = "open member function moved higher" open val det = "open member property moved higher" } // MODULE: lib(base) // FILE: A.kt // VERSION: 1 open class Y: X() { fun foo() = "non-open member function" val bar = "non-open member property" fun nux() = "non-open member function" val zip = "non-open member property" open fun ril() = "open member function" open val det = "open member property" } // FILE: B.kt // VERSION: 2 open class Y: X() { } // MODULE: mainLib(lib) // FILE: mainLib.kt // Note that frontend wouldn't allow us to have Any->String->Int chain of overrides. class Z: X() { fun nux() = "non-open member function sudden conflict" val zip = "non-open member property sudden conflict" } class W: Y() { override fun ril() = "overridden open member function" override val det = "overridden open member property" } fun lib(): String { val y = Y() val z = Z() val w = W() return when { y.foo() != "non-open member function moved higher" -> "fail 1" y.bar != "non-open member property moved higher" -> "fail 2" y.nux() != "non-open member function moved higher to cause conflict" -> "fail 3" y.zip != "non-open member property moved higher to cause conflict" -> "fail 4" y.ril() != "open member function moved higher" -> "fail 5" y.det != "open member property moved higher" -> "fail 6" z.nux() != "non-open member function sudden conflict" -> "fail 7" z.zip != "non-open member property sudden conflict" -> "fail 8" w.ril() != "overridden open member function"-> "fail 9" w.det != "overridden open member property" -> "fail 10" else -> "OK" } } // MODULE: main(mainLib) // FILE: main.kt fun box(): String = lib()