Generate bridges for fake overrides when needed

#KT-3985 Fixed
 #KT-4145 Fixed
This commit is contained in:
Alexander Udalov
2014-03-27 19:33:42 +04:00
parent 2c2c918447
commit 04c237cc22
17 changed files with 300 additions and 97 deletions
@@ -0,0 +1,19 @@
// KT-4145
trait A {
fun foo(): Any
}
open class B {
fun foo(): String = "A"
}
open class C: B(), A
fun box(): String {
val a: A = C()
if (a.foo() != "A") return "Fail 1"
if ((a as B).foo() != "A") return "Fail 2"
if ((a as C).foo() != "A") return "Fail 3"
return "OK"
}
@@ -0,0 +1,21 @@
// KT-3985
trait Trait<T> {
fun f(): T
}
open class Class {
fun f(): String = throw UnsupportedOperationException()
}
class Foo: Class(), Trait<String> {
}
fun box(): String {
try {
(Foo() : Trait<String>).f()
} catch (e: UnsupportedOperationException) {
return "OK"
}
return "Fail"
}
@@ -0,0 +1,28 @@
var result = ""
trait D1 {
fun foo(): D1 {
result += "D1"
return this
}
}
trait F2 : D1
trait D3 : F2 {
override fun foo(): D3 {
result += "D3"
return this
}
}
class D4 : D3
fun box(): String {
val x = D4()
x.foo()
(x : D3).foo()
(x : F2).foo()
(x : D1).foo()
return if (result == "D3D3D3D3") "OK" else "Fail: $result"
}
@@ -0,0 +1,25 @@
trait D1 {
fun foo(): Any
}
trait D2 {
fun foo(): Number
}
trait F3 : D1, D2
open class D4 {
fun foo(): Int = 42
}
class F5 : F3, D4()
fun box(): String {
val z = F5()
var result = z.foo()
result += (z : D4).foo()
result += (z : F3).foo() as Int
result += (z : D2).foo() as Int
result += (z : D1).foo() as Int
return if (result == 5 * 42) "OK" else "Fail: $result"
}