diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java index f8d08d7c6c6..074cdd09c7f 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java @@ -135,5 +135,11 @@ public class LoweredIrInterpreterTestGenerated extends AbstractLoweredIrInterpre public void testUnsignedConst() throws Exception { runTest("compiler/testData/ir/loweredIr/interpreter/unsignedConst.kt"); } + + @Test + @TestMetadata("useCorrectToString.kt") + public void testUseCorrectToString() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/useCorrectToString.kt"); + } } } diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt index a262433b69c..81427969688 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt @@ -134,7 +134,7 @@ class IrCompileTimeChecker( is IrGetObjectValue -> { val toString = arg.symbol.owner.declarations .filterIsInstance() - .single { it.name.asString() == "toString" && it.valueParameters.isEmpty() } + .single { it.name.asString() == "toString" && it.valueParameters.isEmpty() && it.extensionReceiverParameter == null } mode.canEvaluateFunction(toString, null) && toString.visitBodyIfNeeded() } diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt index 9dafb97ca1c..f258d13067a 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt @@ -52,7 +52,7 @@ internal class Common private constructor(override val irClass: IrClass, overrid return irClass.declarations .filterIsInstance() .single { - it.name == Name.identifier("equals") && it.dispatchReceiverParameter != null + it.name == Name.identifier("equals") && it.dispatchReceiverParameter != null && it.extensionReceiverParameter == null && it.valueParameters.size == 1 && it.valueParameters[0].type.isNullableAny() } .let { it.resolveFakeOverride() as IrSimpleFunction } @@ -60,13 +60,13 @@ internal class Common private constructor(override val irClass: IrClass, overrid fun getHashCodeFunction(): IrSimpleFunction { return irClass.declarations.filterIsInstance() - .single { it.name.asString() == "hashCode" && it.valueParameters.isEmpty() } + .single { it.name.asString() == "hashCode" && it.valueParameters.isEmpty() && it.extensionReceiverParameter == null } .let { it.resolveFakeOverride() as IrSimpleFunction } } fun getToStringFunction(): IrSimpleFunction { return irClass.declarations.filterIsInstance() - .single { it.name.asString() == "toString" && it.valueParameters.isEmpty() } + .single { it.name.asString() == "toString" && it.valueParameters.isEmpty() && it.extensionReceiverParameter == null } .let { it.resolveFakeOverride() as IrSimpleFunction } } diff --git a/compiler/testData/ir/loweredIr/interpreter/useCorrectToString.kt b/compiler/testData/ir/loweredIr/interpreter/useCorrectToString.kt new file mode 100644 index 00000000000..e1579b26634 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/useCorrectToString.kt @@ -0,0 +1,13 @@ +// This test is needed to check that IrCompileTimeChecker will not fail trying to find and analyze correct toString method + +object Obj { + override fun toString(): String = "OK" + + fun Int.toString(): String = "Not OK" +} + +const val a = 1 // this is a dummy const to avoid check in IrInterpreterDumpHandler + +fun box(): String { + return "" + "$Obj" // force a call +}