From 531a0de399b75d0820236ce6f49292c1b406bc7f Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 14 Apr 2021 14:56:55 +0300 Subject: [PATCH] JVM_IR KT-46060 'contains' operator without receiver is non-optimizable --- .../codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../backend/common/lower/RangeContainsLowering.kt | 4 ++-- .../box/ranges/contains/jvmStaticContainsInObject.kt | 10 ++++++++++ .../runners/codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/codegen/LightAnalysisModeTestGenerated.java | 5 +++++ 6 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/ranges/contains/jvmStaticContainsInObject.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 47212e2320b..fca4677c2fb 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -28863,6 +28863,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/ranges/contains/inUntilMinValueNonConst.kt"); } + @Test + @TestMetadata("jvmStaticContainsInObject.kt") + public void testJvmStaticContainsInObject() throws Exception { + runTest("compiler/testData/codegen/box/ranges/contains/jvmStaticContainsInObject.kt"); + } + @Test @TestMetadata("kt20106.kt") public void testKt20106() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/RangeContainsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/RangeContainsLowering.kt index dd33986adf1..87291ab434e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/RangeContainsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/RangeContainsLowering.kt @@ -98,8 +98,8 @@ private class Transformer( // The HeaderInfoBuilder extracts information (e.g., lower/upper bounds, direction) from the range expression, which is the // receiver for the contains() call. - val receiver = expression.dispatchReceiver ?: expression.extensionReceiver!! - val headerInfo = receiver.accept(headerInfoBuilder, expression) + val receiver = expression.dispatchReceiver ?: expression.extensionReceiver + val headerInfo = receiver?.accept(headerInfoBuilder, expression) ?: return super.visitCall(expression) // The receiver is not a supported range (or not a range at all). val argument = expression.getValueArgument(0)!! diff --git a/compiler/testData/codegen/box/ranges/contains/jvmStaticContainsInObject.kt b/compiler/testData/codegen/box/ranges/contains/jvmStaticContainsInObject.kt new file mode 100644 index 00000000000..45a0a99d2ea --- /dev/null +++ b/compiler/testData/codegen/box/ranges/contains/jvmStaticContainsInObject.kt @@ -0,0 +1,10 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME + +object O { + @JvmStatic + operator fun contains(x: String): Boolean = x == "O" +} + +fun box() = + if ("O" in O) "OK" else "Failed" diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index e272f504839..a17c2a228b4 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -28845,6 +28845,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/ranges/contains/inUntilMinValueNonConst.kt"); } + @Test + @TestMetadata("jvmStaticContainsInObject.kt") + public void testJvmStaticContainsInObject() throws Exception { + runTest("compiler/testData/codegen/box/ranges/contains/jvmStaticContainsInObject.kt"); + } + @Test @TestMetadata("kt20106.kt") public void testKt20106() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 7a93883b9bd..90919a1569f 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -28863,6 +28863,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/ranges/contains/inUntilMinValueNonConst.kt"); } + @Test + @TestMetadata("jvmStaticContainsInObject.kt") + public void testJvmStaticContainsInObject() throws Exception { + runTest("compiler/testData/codegen/box/ranges/contains/jvmStaticContainsInObject.kt"); + } + @Test @TestMetadata("kt20106.kt") public void testKt20106() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 502fc5e398e..99b823dacd1 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -24537,6 +24537,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/ranges/contains/inUntilMinValueNonConst.kt"); } + @TestMetadata("jvmStaticContainsInObject.kt") + public void testJvmStaticContainsInObject() throws Exception { + runTest("compiler/testData/codegen/box/ranges/contains/jvmStaticContainsInObject.kt"); + } + @TestMetadata("kt20106.kt") public void testKt20106() throws Exception { runTest("compiler/testData/codegen/box/ranges/contains/kt20106.kt");