diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 83978b417b5..ef5e5d40f79 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -556,6 +556,26 @@ task bridges_test16(type: RunKonanTest) { source = "codegen/bridges/test16.kt" } +task classDelegation_method(type: RunKonanTest) { + goldValue = "OKOK\n" + source = "codegen/classDelegation/method.kt" +} + +task classDelegation_property(type: RunKonanTest) { + goldValue = "4242\n" + source = "codegen/classDelegation/property.kt" +} + +task classDelegation_generic(type: RunKonanTest) { + goldValue = "OK\n" + source = "codegen/classDelegation/generic.kt" +} + +task classDelegation_withBridge(type: RunKonanTest) { + goldValue = "OK\n" + source = "codegen/classDelegation/withBridge.kt" +} + task array0(type: RunKonanTest) { goldValue = "5\n6\n7\n8\n9\n10\n11\n12\n13\n" source = "runtime/collections/array0.kt" diff --git a/backend.native/tests/codegen/classDelegation/generic.kt b/backend.native/tests/codegen/classDelegation/generic.kt new file mode 100644 index 00000000000..106e2a5af99 --- /dev/null +++ b/backend.native/tests/codegen/classDelegation/generic.kt @@ -0,0 +1,21 @@ +open class Content() { + override fun toString() = "OK" +} + +interface Box { + fun get(): E +} + +interface ContentBox : Box + +object Impl : ContentBox { + override fun get(): Content = Content() +} + +class ContentBoxDelegate() : ContentBox by (Impl as ContentBox) + +fun box() = ContentBoxDelegate().get().toString() + +fun main(args: Array) { + println(box()) +} \ No newline at end of file diff --git a/backend.native/tests/codegen/classDelegation/method.kt b/backend.native/tests/codegen/classDelegation/method.kt new file mode 100644 index 00000000000..214c697b35c --- /dev/null +++ b/backend.native/tests/codegen/classDelegation/method.kt @@ -0,0 +1,19 @@ +interface A { + fun foo(): T +} + +class B : A { + override fun foo() = "OK" +} + +class C(a: A) : A by a + +fun box(): String { + val c = C(B()) + val a: A = c + return c.foo() + a.foo() +} + +fun main(args: Array) { + println(box()) +} \ No newline at end of file diff --git a/backend.native/tests/codegen/classDelegation/property.kt b/backend.native/tests/codegen/classDelegation/property.kt new file mode 100644 index 00000000000..bd6be7e2e49 --- /dev/null +++ b/backend.native/tests/codegen/classDelegation/property.kt @@ -0,0 +1,19 @@ +interface A { + val x: Int +} + +class C: A { + override val x: Int = 42 +} + +class Q(a: A): A by a + +fun box(): String { + val q = Q(C()) + val a: A = q + return q.x.toString() + a.x.toString() +} + +fun main(args: Array) { + println(box()) +} \ No newline at end of file diff --git a/backend.native/tests/codegen/classDelegation/withBridge.kt b/backend.native/tests/codegen/classDelegation/withBridge.kt new file mode 100644 index 00000000000..1e0fc393050 --- /dev/null +++ b/backend.native/tests/codegen/classDelegation/withBridge.kt @@ -0,0 +1,28 @@ +interface A { + fun foo(t: T): String +} + +interface B { + fun foo(t: Int) = "B" +} + +class Z : B + +class Z1 : A, B by Z() + +fun box(): String { + val z1 = Z1() + val z1a: A = z1 + val z1b: B = z1 + + return when { + z1.foo( 0) != "B" -> "Fail #1" + z1a.foo( 0) != "B" -> "Fail #2" + z1b.foo( 0) != "B" -> "Fail #3" + else -> "OK" + } +} + +fun main(args: Array) { + println(box()) +} \ No newline at end of file