From 3049cc759a43a37433e0457b47bd1c4598017add Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Mon, 23 Sep 2019 15:41:23 +0300 Subject: [PATCH] Added test on conservative itable --- backend.native/tests/build.gradle | 5 + .../conservativeItable.kt | 686 ++++++++++++++++++ 2 files changed, 691 insertions(+) create mode 100644 backend.native/tests/codegen/interfaceCallsNCasts/conservativeItable.kt diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index b5c8e19b228..4d6bc1ae7e0 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -2431,6 +2431,11 @@ standaloneTest("devirtualization_anonymousObject") { source = "codegen/devirtualization/anonymousObject.kt" } +task interfaceCallsNCasts_conservativeItable(type: KonanLocalTest) { + goldValue = "539\n5050\n26551140\n" + source = "codegen/interfaceCallsNCasts/conservativeItable.kt" +} + standaloneTest("multiargs") { arguments = ["AAA", "BB", "C"] multiRuns = true diff --git a/backend.native/tests/codegen/interfaceCallsNCasts/conservativeItable.kt b/backend.native/tests/codegen/interfaceCallsNCasts/conservativeItable.kt new file mode 100644 index 00000000000..fffc6c51848 --- /dev/null +++ b/backend.native/tests/codegen/interfaceCallsNCasts/conservativeItable.kt @@ -0,0 +1,686 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the LICENSE file. + */ + +package codegen.interfaceCallsNCasts.conservativeItable + +import kotlin.test.* + +interface I0 { + fun foo0(x: Int): Int +} +interface I1 { + fun foo1(x: Int): Int +} +interface I2 { + fun foo2(x: Int): Int +} +interface I3 { + fun foo3(x: Int): Int +} +interface I4 { + fun foo4(x: Int): Int +} +interface I5 { + fun foo5(x: Int): Int +} +interface I6 { + fun foo6(x: Int): Int +} +interface I7 { + fun foo7(x: Int): Int +} +interface I8 { + fun foo8(x: Int): Int +} +interface I9 { + fun foo9(x: Int): Int +} +interface I10 { + fun foo10(x: Int): Int +} +interface I11 { + fun foo11(x: Int): Int +} +interface I12 { + fun foo12(x: Int): Int +} +interface I13 { + fun foo13(x: Int): Int +} +interface I14 { + fun foo14(x: Int): Int +} +interface I15 { + fun foo15(x: Int): Int +} +interface I16 { + fun foo16(x: Int): Int +} +interface I17 { + fun foo17(x: Int): Int +} +interface I18 { + fun foo18(x: Int): Int +} +interface I19 { + fun foo19(x: Int): Int +} +interface I20 { + fun foo20(x: Int): Int +} +interface I21 { + fun foo21(x: Int): Int +} +interface I22 { + fun foo22(x: Int): Int +} +interface I23 { + fun foo23(x: Int): Int +} +interface I24 { + fun foo24(x: Int): Int +} +interface I25 { + fun foo25(x: Int): Int +} +interface I26 { + fun foo26(x: Int): Int +} +interface I27 { + fun foo27(x: Int): Int +} +interface I28 { + fun foo28(x: Int): Int +} +interface I29 { + fun foo29(x: Int): Int +} +interface I30 { + fun foo30(x: Int): Int +} +interface I31 { + fun foo31(x: Int): Int +} +interface I32 { + fun foo32(x: Int): Int +} +interface I33 { + fun foo33(x: Int): Int +} +interface I34 { + fun foo34(x: Int): Int +} +interface I35 { + fun foo35(x: Int): Int +} +interface I36 { + fun foo36(x: Int): Int +} +interface I37 { + fun foo37(x: Int): Int +} +interface I38 { + fun foo38(x: Int): Int +} +interface I39 { + fun foo39(x: Int): Int +} +interface I40 { + fun foo40(x: Int): Int +} +interface I41 { + fun foo41(x: Int): Int +} +interface I42 { + fun foo42(x: Int): Int +} +interface I43 { + fun foo43(x: Int): Int +} +interface I44 { + fun foo44(x: Int): Int +} +interface I45 { + fun foo45(x: Int): Int +} +interface I46 { + fun foo46(x: Int): Int +} +interface I47 { + fun foo47(x: Int): Int +} +interface I48 { + fun foo48(x: Int): Int +} +interface I49 { + fun foo49(x: Int): Int +} +interface I50 { + fun foo50(x: Int): Int +} +interface I51 { + fun foo51(x: Int): Int +} +interface I52 { + fun foo52(x: Int): Int +} +interface I53 { + fun foo53(x: Int): Int +} +interface I54 { + fun foo54(x: Int): Int +} +interface I55 { + fun foo55(x: Int): Int +} +interface I56 { + fun foo56(x: Int): Int +} +interface I57 { + fun foo57(x: Int): Int +} +interface I58 { + fun foo58(x: Int): Int +} +interface I59 { + fun foo59(x: Int): Int +} +interface I60 { + fun foo60(x: Int): Int +} +interface I61 { + fun foo61(x: Int): Int +} +interface I62 { + fun foo62(x: Int): Int +} +interface I63 { + fun foo63(x: Int): Int +} +interface I64 { + fun foo64(x: Int): Int +} +interface I65 { + fun foo65(x: Int): Int +} +interface I66 { + fun foo66(x: Int): Int +} +interface I67 { + fun foo67(x: Int): Int +} +interface I68 { + fun foo68(x: Int): Int +} +interface I69 { + fun foo69(x: Int): Int +} +interface I70 { + fun foo70(x: Int): Int +} +interface I71 { + fun foo71(x: Int): Int +} +interface I72 { + fun foo72(x: Int): Int +} +interface I73 { + fun foo73(x: Int): Int +} +interface I74 { + fun foo74(x: Int): Int +} +interface I75 { + fun foo75(x: Int): Int +} +interface I76 { + fun foo76(x: Int): Int +} +interface I77 { + fun foo77(x: Int): Int +} +interface I78 { + fun foo78(x: Int): Int +} +interface I79 { + fun foo79(x: Int): Int +} +interface I80 { + fun foo80(x: Int): Int +} +interface I81 { + fun foo81(x: Int): Int +} +interface I82 { + fun foo82(x: Int): Int +} +interface I83 { + fun foo83(x: Int): Int +} +interface I84 { + fun foo84(x: Int): Int +} +interface I85 { + fun foo85(x: Int): Int +} +interface I86 { + fun foo86(x: Int): Int +} +interface I87 { + fun foo87(x: Int): Int +} +interface I88 { + fun foo88(x: Int): Int +} +interface I89 { + fun foo89(x: Int): Int +} +interface I90 { + fun foo90(x: Int): Int +} +interface I91 { + fun foo91(x: Int): Int +} +interface I92 { + fun foo92(x: Int): Int +} +interface I93 { + fun foo93(x: Int): Int +} +interface I94 { + fun foo94(x: Int): Int +} +interface I95 { + fun foo95(x: Int): Int +} +interface I96 { + fun foo96(x: Int): Int +} +interface I97 { + fun foo97(x: Int): Int +} +interface I98 { + fun foo98(x: Int): Int +} +interface I99 { + fun foo99(x: Int): Int +} +class Bar : I0, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, I21, I22, + I23, I24, I25, I26, I27, I28, I29, I30, I31, I32, I33, I34, I35, I36, I37, I38, I39, I40, I41, I42, I43, I44, + I45, I46, I47, I48, I49, I50, I51, I52, I53, I54, I55, I56, I57, I58, I59, I60, I61, I62, I63, I64, I65, I66, + I67, I68, I69, I70, I71, I72, I73, I74, I75, I76, I77, I78, I79, I80, I81, I82, I83, I84, I85, I86, I87, I88, + I89, I90, I91, I92, I93, I94, I95, I96, I97, I98, I99 { + override fun foo0(x: Int) = x + 0 + override fun foo1(x: Int) = x + 1 + override fun foo2(x: Int) = x + 2 + override fun foo3(x: Int) = x + 3 + override fun foo4(x: Int) = x + 4 + override fun foo5(x: Int) = x + 5 + override fun foo6(x: Int) = x + 6 + override fun foo7(x: Int) = x + 7 + override fun foo8(x: Int) = x + 8 + override fun foo9(x: Int) = x + 9 + override fun foo10(x: Int) = x + 10 + override fun foo11(x: Int) = x + 11 + override fun foo12(x: Int) = x + 12 + override fun foo13(x: Int) = x + 13 + override fun foo14(x: Int) = x + 14 + override fun foo15(x: Int) = x + 15 + override fun foo16(x: Int) = x + 16 + override fun foo17(x: Int) = x + 17 + override fun foo18(x: Int) = x + 18 + override fun foo19(x: Int) = x + 19 + override fun foo20(x: Int) = x + 20 + override fun foo21(x: Int) = x + 21 + override fun foo22(x: Int) = x + 22 + override fun foo23(x: Int) = x + 23 + override fun foo24(x: Int) = x + 24 + override fun foo25(x: Int) = x + 25 + override fun foo26(x: Int) = x + 26 + override fun foo27(x: Int) = x + 27 + override fun foo28(x: Int) = x + 28 + override fun foo29(x: Int) = x + 29 + override fun foo30(x: Int) = x + 30 + override fun foo31(x: Int) = x + 31 + override fun foo32(x: Int) = x + 32 + override fun foo33(x: Int) = x + 33 + override fun foo34(x: Int) = x + 34 + override fun foo35(x: Int) = x + 35 + override fun foo36(x: Int) = x + 36 + override fun foo37(x: Int) = x + 37 + override fun foo38(x: Int) = x + 38 + override fun foo39(x: Int) = x + 39 + override fun foo40(x: Int) = x + 40 + override fun foo41(x: Int) = x + 41 + override fun foo42(x: Int) = x + 42 + override fun foo43(x: Int) = x + 43 + override fun foo44(x: Int) = x + 44 + override fun foo45(x: Int) = x + 45 + override fun foo46(x: Int) = x + 46 + override fun foo47(x: Int) = x + 47 + override fun foo48(x: Int) = x + 48 + override fun foo49(x: Int) = x + 49 + override fun foo50(x: Int) = x + 50 + override fun foo51(x: Int) = x + 51 + override fun foo52(x: Int) = x + 52 + override fun foo53(x: Int) = x + 53 + override fun foo54(x: Int) = x + 54 + override fun foo55(x: Int) = x + 55 + override fun foo56(x: Int) = x + 56 + override fun foo57(x: Int) = x + 57 + override fun foo58(x: Int) = x + 58 + override fun foo59(x: Int) = x + 59 + override fun foo60(x: Int) = x + 60 + override fun foo61(x: Int) = x + 61 + override fun foo62(x: Int) = x + 62 + override fun foo63(x: Int) = x + 63 + override fun foo64(x: Int) = x + 64 + override fun foo65(x: Int) = x + 65 + override fun foo66(x: Int) = x + 66 + override fun foo67(x: Int) = x + 67 + override fun foo68(x: Int) = x + 68 + override fun foo69(x: Int) = x + 69 + override fun foo70(x: Int) = x + 70 + override fun foo71(x: Int) = x + 71 + override fun foo72(x: Int) = x + 72 + override fun foo73(x: Int) = x + 73 + override fun foo74(x: Int) = x + 74 + override fun foo75(x: Int) = x + 75 + override fun foo76(x: Int) = x + 76 + override fun foo77(x: Int) = x + 77 + override fun foo78(x: Int) = x + 78 + override fun foo79(x: Int) = x + 79 + override fun foo80(x: Int) = x + 80 + override fun foo81(x: Int) = x + 81 + override fun foo82(x: Int) = x + 82 + override fun foo83(x: Int) = x + 83 + override fun foo84(x: Int) = x + 84 + override fun foo85(x: Int) = x + 85 + override fun foo86(x: Int) = x + 86 + override fun foo87(x: Int) = x + 87 + override fun foo88(x: Int) = x + 88 + override fun foo89(x: Int) = x + 89 + override fun foo90(x: Int) = x + 90 + override fun foo91(x: Int) = x + 91 + override fun foo92(x: Int) = x + 92 + override fun foo93(x: Int) = x + 93 + override fun foo94(x: Int) = x + 94 + override fun foo95(x: Int) = x + 95 + override fun foo96(x: Int) = x + 96 + override fun foo97(x: Int) = x + 97 + override fun foo98(x: Int) = x + 98 + override fun foo99(x: Int) = x + 99 +} + +fun check_is_I0(x: Any) = x is I0 +fun check_is_I1(x: Any) = x is I1 +fun check_is_I2(x: Any) = x is I2 +fun check_is_I3(x: Any) = x is I3 +fun check_is_I4(x: Any) = x is I4 +fun check_is_I5(x: Any) = x is I5 +fun check_is_I6(x: Any) = x is I6 +fun check_is_I7(x: Any) = x is I7 +fun check_is_I8(x: Any) = x is I8 +fun check_is_I9(x: Any) = x is I9 +fun check_is_I10(x: Any) = x is I10 +fun check_is_I11(x: Any) = x is I11 +fun check_is_I12(x: Any) = x is I12 +fun check_is_I13(x: Any) = x is I13 +fun check_is_I14(x: Any) = x is I14 +fun check_is_I15(x: Any) = x is I15 +fun check_is_I16(x: Any) = x is I16 +fun check_is_I17(x: Any) = x is I17 +fun check_is_I18(x: Any) = x is I18 +fun check_is_I19(x: Any) = x is I19 +fun check_is_I20(x: Any) = x is I20 +fun check_is_I21(x: Any) = x is I21 +fun check_is_I22(x: Any) = x is I22 +fun check_is_I23(x: Any) = x is I23 +fun check_is_I24(x: Any) = x is I24 +fun check_is_I25(x: Any) = x is I25 +fun check_is_I26(x: Any) = x is I26 +fun check_is_I27(x: Any) = x is I27 +fun check_is_I28(x: Any) = x is I28 +fun check_is_I29(x: Any) = x is I29 +fun check_is_I30(x: Any) = x is I30 +fun check_is_I31(x: Any) = x is I31 +fun check_is_I32(x: Any) = x is I32 +fun check_is_I33(x: Any) = x is I33 +fun check_is_I34(x: Any) = x is I34 +fun check_is_I35(x: Any) = x is I35 +fun check_is_I36(x: Any) = x is I36 +fun check_is_I37(x: Any) = x is I37 +fun check_is_I38(x: Any) = x is I38 +fun check_is_I39(x: Any) = x is I39 +fun check_is_I40(x: Any) = x is I40 +fun check_is_I41(x: Any) = x is I41 +fun check_is_I42(x: Any) = x is I42 +fun check_is_I43(x: Any) = x is I43 +fun check_is_I44(x: Any) = x is I44 +fun check_is_I45(x: Any) = x is I45 +fun check_is_I46(x: Any) = x is I46 +fun check_is_I47(x: Any) = x is I47 +fun check_is_I48(x: Any) = x is I48 +fun check_is_I49(x: Any) = x is I49 +fun check_is_I50(x: Any) = x is I50 +fun check_is_I51(x: Any) = x is I51 +fun check_is_I52(x: Any) = x is I52 +fun check_is_I53(x: Any) = x is I53 +fun check_is_I54(x: Any) = x is I54 +fun check_is_I55(x: Any) = x is I55 +fun check_is_I56(x: Any) = x is I56 +fun check_is_I57(x: Any) = x is I57 +fun check_is_I58(x: Any) = x is I58 +fun check_is_I59(x: Any) = x is I59 +fun check_is_I60(x: Any) = x is I60 +fun check_is_I61(x: Any) = x is I61 +fun check_is_I62(x: Any) = x is I62 +fun check_is_I63(x: Any) = x is I63 +fun check_is_I64(x: Any) = x is I64 +fun check_is_I65(x: Any) = x is I65 +fun check_is_I66(x: Any) = x is I66 +fun check_is_I67(x: Any) = x is I67 +fun check_is_I68(x: Any) = x is I68 +fun check_is_I69(x: Any) = x is I69 +fun check_is_I70(x: Any) = x is I70 +fun check_is_I71(x: Any) = x is I71 +fun check_is_I72(x: Any) = x is I72 +fun check_is_I73(x: Any) = x is I73 +fun check_is_I74(x: Any) = x is I74 +fun check_is_I75(x: Any) = x is I75 +fun check_is_I76(x: Any) = x is I76 +fun check_is_I77(x: Any) = x is I77 +fun check_is_I78(x: Any) = x is I78 +fun check_is_I79(x: Any) = x is I79 +fun check_is_I80(x: Any) = x is I80 +fun check_is_I81(x: Any) = x is I81 +fun check_is_I82(x: Any) = x is I82 +fun check_is_I83(x: Any) = x is I83 +fun check_is_I84(x: Any) = x is I84 +fun check_is_I85(x: Any) = x is I85 +fun check_is_I86(x: Any) = x is I86 +fun check_is_I87(x: Any) = x is I87 +fun check_is_I88(x: Any) = x is I88 +fun check_is_I89(x: Any) = x is I89 +fun check_is_I90(x: Any) = x is I90 +fun check_is_I91(x: Any) = x is I91 +fun check_is_I92(x: Any) = x is I92 +fun check_is_I93(x: Any) = x is I93 +fun check_is_I94(x: Any) = x is I94 +fun check_is_I95(x: Any) = x is I95 +fun check_is_I96(x: Any) = x is I96 +fun check_is_I97(x: Any) = x is I97 +fun check_is_I98(x: Any) = x is I98 +fun check_is_I99(x: Any) = x is I99 + +interface I_M1 { + fun bar(x: Int): Int +} + +class Bar2 : I_M1 { + override fun bar(x: Int) = 497 * x + 42 +} + +class I42_Impl1 : I42 { + override fun foo42(x: Int) = x * 2 + 42 +} + +class I42_Impl2 : I42 { + override fun foo42(x: Int) = x * 3 + 42 +} + +class I42_Impl3 : I42 { + override fun foo42(x: Int) = x * 4 + 42 +} + +class I42_Impl4 : I42 { + override fun foo42(x: Int) = x * 5 + 42 +} + +class I42_Impl5 : I42 { + override fun foo42(x: Int) = x * 6 + 42 +} + +class I42_Impl6 : I42 { + override fun foo42(x: Int) = x * 7 + 42 +} + +class I42_Impl7 : I42 { + override fun foo42(x: Int) = x * 8 + 42 +} + +class I42_Impl8 : I42 { + override fun foo42(x: Int) = x * 9 + 42 +} + +fun foo(i42: I42, x: Int) = i42.foo42(x) + +fun bar(i_m1: I_M1, x: Int) = i_m1.bar(x) + +@Test fun runTest() { + val y = Bar2() + println(bar(y, 1)) + val x0 = Bar() + var t = 0 + if (check_is_I0(x0)) t = t + 1 + if (check_is_I1(x0)) t = t + 2 + if (check_is_I2(x0)) t = t + 3 + if (check_is_I3(x0)) t = t + 4 + if (check_is_I4(x0)) t = t + 5 + if (check_is_I5(x0)) t = t + 6 + if (check_is_I6(x0)) t = t + 7 + if (check_is_I7(x0)) t = t + 8 + if (check_is_I8(x0)) t = t + 9 + if (check_is_I9(x0)) t = t + 10 + if (check_is_I10(x0)) t = t + 11 + if (check_is_I11(x0)) t = t + 12 + if (check_is_I12(x0)) t = t + 13 + if (check_is_I13(x0)) t = t + 14 + if (check_is_I14(x0)) t = t + 15 + if (check_is_I15(x0)) t = t + 16 + if (check_is_I16(x0)) t = t + 17 + if (check_is_I17(x0)) t = t + 18 + if (check_is_I18(x0)) t = t + 19 + if (check_is_I19(x0)) t = t + 20 + if (check_is_I20(x0)) t = t + 21 + if (check_is_I21(x0)) t = t + 22 + if (check_is_I22(x0)) t = t + 23 + if (check_is_I23(x0)) t = t + 24 + if (check_is_I24(x0)) t = t + 25 + if (check_is_I25(x0)) t = t + 26 + if (check_is_I26(x0)) t = t + 27 + if (check_is_I27(x0)) t = t + 28 + if (check_is_I28(x0)) t = t + 29 + if (check_is_I29(x0)) t = t + 30 + if (check_is_I30(x0)) t = t + 31 + if (check_is_I31(x0)) t = t + 32 + if (check_is_I32(x0)) t = t + 33 + if (check_is_I33(x0)) t = t + 34 + if (check_is_I34(x0)) t = t + 35 + if (check_is_I35(x0)) t = t + 36 + if (check_is_I36(x0)) t = t + 37 + if (check_is_I37(x0)) t = t + 38 + if (check_is_I38(x0)) t = t + 39 + if (check_is_I39(x0)) t = t + 40 + if (check_is_I40(x0)) t = t + 41 + if (check_is_I41(x0)) t = t + 42 + if (check_is_I42(x0)) t = t + 43 + if (check_is_I43(x0)) t = t + 44 + if (check_is_I44(x0)) t = t + 45 + if (check_is_I45(x0)) t = t + 46 + if (check_is_I46(x0)) t = t + 47 + if (check_is_I47(x0)) t = t + 48 + if (check_is_I48(x0)) t = t + 49 + if (check_is_I49(x0)) t = t + 50 + if (check_is_I50(x0)) t = t + 51 + if (check_is_I51(x0)) t = t + 52 + if (check_is_I52(x0)) t = t + 53 + if (check_is_I53(x0)) t = t + 54 + if (check_is_I54(x0)) t = t + 55 + if (check_is_I55(x0)) t = t + 56 + if (check_is_I56(x0)) t = t + 57 + if (check_is_I57(x0)) t = t + 58 + if (check_is_I58(x0)) t = t + 59 + if (check_is_I59(x0)) t = t + 60 + if (check_is_I60(x0)) t = t + 61 + if (check_is_I61(x0)) t = t + 62 + if (check_is_I62(x0)) t = t + 63 + if (check_is_I63(x0)) t = t + 64 + if (check_is_I64(x0)) t = t + 65 + if (check_is_I65(x0)) t = t + 66 + if (check_is_I66(x0)) t = t + 67 + if (check_is_I67(x0)) t = t + 68 + if (check_is_I68(x0)) t = t + 69 + if (check_is_I69(x0)) t = t + 70 + if (check_is_I70(x0)) t = t + 71 + if (check_is_I71(x0)) t = t + 72 + if (check_is_I72(x0)) t = t + 73 + if (check_is_I73(x0)) t = t + 74 + if (check_is_I74(x0)) t = t + 75 + if (check_is_I75(x0)) t = t + 76 + if (check_is_I76(x0)) t = t + 77 + if (check_is_I77(x0)) t = t + 78 + if (check_is_I78(x0)) t = t + 79 + if (check_is_I79(x0)) t = t + 80 + if (check_is_I80(x0)) t = t + 81 + if (check_is_I81(x0)) t = t + 82 + if (check_is_I82(x0)) t = t + 83 + if (check_is_I83(x0)) t = t + 84 + if (check_is_I84(x0)) t = t + 85 + if (check_is_I85(x0)) t = t + 86 + if (check_is_I86(x0)) t = t + 87 + if (check_is_I87(x0)) t = t + 88 + if (check_is_I88(x0)) t = t + 89 + if (check_is_I89(x0)) t = t + 90 + if (check_is_I90(x0)) t = t + 91 + if (check_is_I91(x0)) t = t + 92 + if (check_is_I92(x0)) t = t + 93 + if (check_is_I93(x0)) t = t + 94 + if (check_is_I94(x0)) t = t + 95 + if (check_is_I95(x0)) t = t + 96 + if (check_is_I96(x0)) t = t + 97 + if (check_is_I97(x0)) t = t + 98 + if (check_is_I98(x0)) t = t + 99 + if (check_is_I99(x0)) t = t + 100 + println(t) + val x1 = I42_Impl1() + val x2 = I42_Impl2() + val x3 = I42_Impl3() + val x4 = I42_Impl4() + val x5 = I42_Impl5() + val x6 = I42_Impl6() + val x7 = I42_Impl7() + val x8 = I42_Impl8() + t = foo(x0, 1) + t = foo(x1, t) + t = foo(x2, t) + t = foo(x3, t) + t = foo(x4, t) + t = foo(x5, t) + t = foo(x6, t) + t = foo(x7, t) + t = foo(x8, t) + println(t) +}