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 1d612b141c9..700efd4d511 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 @@ -49597,6 +49597,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/syntheticExtensions/implicitReceiver.kt"); } + @Test + @TestMetadata("kt56154.kt") + public void testKt56154() throws Exception { + runTest("compiler/testData/codegen/box/syntheticExtensions/kt56154.kt"); + } + @Test @TestMetadata("overrideKotlinPropertyByJavaMethod.kt") public void testOverrideKotlinPropertyByJavaMethod() throws Exception { diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt index d834e20f9d0..f7ec2037993 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt @@ -352,15 +352,18 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : IrEle call.putValueArgument(index++, computeSignatureString(expression)) if (useOptimizedSuperClass) { val isPackage = (container is IrClass && container.isFileClass) || container is IrPackageFragment - val isJavaSynthetic = (expression.symbol.owner as? IrProperty)?.let { - it.backingField == null && - (it.origin == IrDeclarationOrigin.SYNTHETIC_JAVA_PROPERTY_DELEGATE - || it.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB) - } ?: false - call.putValueArgument(index, irInt((if (isPackage) 1 else 0) or (if (isJavaSynthetic) 2 else 0))) + call.putValueArgument(index, irInt((if (isPackage) 1 else 0) or (if (expression.isJavaSyntheticPropertyReference) 2 else 0))) } } + private val IrCallableReference<*>.isJavaSyntheticPropertyReference: Boolean + get() = + symbol.owner.let { + it is IrProperty && it.backingField == null && + (it.origin == IrDeclarationOrigin.SYNTHETIC_JAVA_PROPERTY_DELEGATE + || it.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB) + } + // Create an instance of KProperty that overrides the get() and set() methods to directly call getX() and setX() on the object. // This is (relatively) fast, but space-inefficient. Also, the instances can store bound receivers in their fields. Example: // @@ -419,7 +422,11 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : IrEle if (field == null) { fun IrBuilderWithScope.setCallArguments(call: IrCall, arguments: List) { val receiverFromField = boundReceiver?.let { irImplicitCast(irGetField(irGet(arguments[0]), backingField), it.type) } - call.copyTypeArgumentsFrom(expression) + if (expression.isJavaSyntheticPropertyReference) { + assert(call.typeArgumentsCount == 0) { "Unexpected type arguments: ${call.typeArgumentsCount}" } + } else { + call.copyTypeArgumentsFrom(expression) + } call.dispatchReceiver = call.symbol.owner.dispatchReceiverParameter?.let { receiverFromField ?: irImplicitCast(irGet(arguments[1]), expression.receiverType) } diff --git a/compiler/testData/codegen/box/syntheticExtensions/kt56154.kt b/compiler/testData/codegen/box/syntheticExtensions/kt56154.kt new file mode 100644 index 00000000000..d73e6b5fe11 --- /dev/null +++ b/compiler/testData/codegen/box/syntheticExtensions/kt56154.kt @@ -0,0 +1,23 @@ +// TARGET_BACKEND: JVM_IR +// !LANGUAGE: +ReferencesToSyntheticJavaProperties + +// FILE: Generic.java +public class Generic { + public String getStringVal() { return null; } + public void setStringVal(String value) {} + + public T getGenericVal() { return null; } + public void setGenericVal(T value) {} +} + +// FILE: main.kt +fun box(): String { + Generic::stringVal + Generic::genericVal + + val o = Generic() + o::stringVal + o::genericVal + + return "OK" +} \ No newline at end of file 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 b9b32e03391..35a7bb74881 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 @@ -49597,6 +49597,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/syntheticExtensions/implicitReceiver.kt"); } + @Test + @TestMetadata("kt56154.kt") + public void testKt56154() throws Exception { + runTest("compiler/testData/codegen/box/syntheticExtensions/kt56154.kt"); + } + @Test @TestMetadata("overrideKotlinPropertyByJavaMethod.kt") public void testOverrideKotlinPropertyByJavaMethod() throws Exception {