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 1bff5f4a925..01fe17d9d2f 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 @@ -24242,6 +24242,30 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/jvmField/interfaceCompanionWithJava.kt"); } + @Test + @TestMetadata("kt47328.kt") + public void testKt47328() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328.kt"); + } + + @Test + @TestMetadata("kt47328_inherited.kt") + public void testKt47328_inherited() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_inherited.kt"); + } + + @Test + @TestMetadata("kt47328_super.kt") + public void testKt47328_super() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_super.kt"); + } + + @Test + @TestMetadata("kt47328_var.kt") + public void testKt47328_var() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_var.kt"); + } + @Test @TestMetadata("publicField.kt") public void testPublicField() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java index f478ef65379..30ee4f7dbcd 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java @@ -1412,6 +1412,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/expressions/kt47245.kt"); } + @Test + @TestMetadata("kt47328.kt") + public void testKt47328() throws Exception { + runTest("compiler/testData/ir/irText/expressions/kt47328.kt"); + } + @Test @TestMetadata("lambdaInCAO.kt") public void testLambdaInCAO() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmPropertiesLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmPropertiesLowering.kt index e0f1795f86e..62a1630d9c9 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmPropertiesLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmPropertiesLowering.kt @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.requiresMangling import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* @@ -34,7 +33,6 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addIfNotNull -import java.util.* class JvmPropertiesLowering(private val backendContext: JvmBackendContext) : IrElementTransformerVoidWithContext(), FileLoweringPass { override fun lower(irFile: IrFile) { @@ -85,18 +83,20 @@ class JvmPropertiesLowering(private val backendContext: JvmBackendContext) : IrE backingField?.origin == JvmLoweredDeclarationOrigin.COMPANION_PROPERTY_BACKING_FIELD } - private fun IrBuilderWithScope.substituteSetter(irProperty: IrProperty, expression: IrCall): IrExpression = - patchReceiver( + private fun IrBuilderWithScope.substituteSetter(irProperty: IrProperty, expression: IrCall): IrExpression { + val backingField = irProperty.resolveFakeOverride()!!.backingField!! + return patchReceiver( irSetField( - expression.dispatchReceiver, - irProperty.resolveFakeOverride()!!.backingField!!, + patchFieldAccessReceiver(expression, irProperty), + backingField, expression.getValueArgument(0)!! ) ) + } private fun IrBuilderWithScope.substituteGetter(irProperty: IrProperty, expression: IrCall): IrExpression { val backingField = irProperty.resolveFakeOverride()!!.backingField!! - val value = irGetField(expression.dispatchReceiver, backingField) + val value = irGetField(patchFieldAccessReceiver(expression, irProperty), backingField) return if (irProperty.isLateinit) { irBlock { val tmpVal = irTemporary(value) @@ -112,6 +112,17 @@ class JvmPropertiesLowering(private val backendContext: JvmBackendContext) : IrE } } + private fun IrBuilderWithScope.patchFieldAccessReceiver(expression: IrCall, irProperty: IrProperty): IrExpression? { + val receiver = expression.dispatchReceiver + if (receiver != null) { + val propertyParent = irProperty.parent + if (propertyParent is IrClass && propertyParent.symbol != receiver.type.classifierOrNull) { + return irImplicitCast(receiver, propertyParent.defaultType) + } + } + return receiver + } + private fun IrBuilderWithScope.patchReceiver(expression: IrFieldAccessExpression): IrExpression = if (expression.symbol.owner.isStatic && expression.receiver != null) { irBlock { @@ -123,7 +134,7 @@ class JvmPropertiesLowering(private val backendContext: JvmBackendContext) : IrE expression } - private fun lowerProperty(declaration: IrProperty, kind: ClassKind): List? = + private fun lowerProperty(declaration: IrProperty, kind: ClassKind): List = ArrayList(4).apply { val field = declaration.backingField diff --git a/compiler/testData/codegen/box/jvmField/kt47328.kt b/compiler/testData/codegen/box/jvmField/kt47328.kt new file mode 100644 index 00000000000..25b83a71b69 --- /dev/null +++ b/compiler/testData/codegen/box/jvmField/kt47328.kt @@ -0,0 +1,17 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME + +interface A { val x: Int } + +class B(@JvmField override val x: Int): A + +class C(@JvmField val d: D) + +class E(c: C) { val ax = c.d.x } + +fun box(): String { + val e = E(C(B(42))) + if (e.ax != 42) + return "Failed: ${e.ax}" + return "OK" +} diff --git a/compiler/testData/codegen/box/jvmField/kt47328_inherited.kt b/compiler/testData/codegen/box/jvmField/kt47328_inherited.kt new file mode 100644 index 00000000000..cf451a6c436 --- /dev/null +++ b/compiler/testData/codegen/box/jvmField/kt47328_inherited.kt @@ -0,0 +1,23 @@ +// TARGET_BACKEND: JVM +// IGNORE_BACKEND_FIR: JVM_IR +// ^ generates 'GETFIELD B.x : I' instead of 'GETFIELD BB.x : I' +// WITH_RUNTIME + +interface A { val x: Int } + +open class B(@JvmField override val x: Int): A + +class BB(x: Int) : B(x) + +class C(@JvmField val d: D) + +class E(c: C) { val ax = c.d.x } +// CHECK_BYTECODE_TEXT +// 1 GETFIELD BB\.x \: I + +fun box(): String { + val e = E(C(BB(42))) + if (e.ax != 42) + return "Failed: ${e.ax}" + return "OK" +} diff --git a/compiler/testData/codegen/box/jvmField/kt47328_super.kt b/compiler/testData/codegen/box/jvmField/kt47328_super.kt new file mode 100644 index 00000000000..1ed2c14f04c --- /dev/null +++ b/compiler/testData/codegen/box/jvmField/kt47328_super.kt @@ -0,0 +1,18 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME + +interface A { val x: String } + +open class B(@JvmField override val x: String): A + +open class BB(x: String) : B(x) + +class X(x: String) : A, BB(x) { + override val x: String + get() = super.x +} + +fun box(): String { + val e = X("OK") + return e.x +} diff --git a/compiler/testData/codegen/box/jvmField/kt47328_var.kt b/compiler/testData/codegen/box/jvmField/kt47328_var.kt new file mode 100644 index 00000000000..078e4b5120b --- /dev/null +++ b/compiler/testData/codegen/box/jvmField/kt47328_var.kt @@ -0,0 +1,22 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME + +interface A { var x: Int } + +class B(@JvmField override var x: Int): A + +class C(@JvmField val d: D) + +class E(c: C) { + init { + c.d.x = 42 + } + val ax = c.d.x +} + +fun box(): String { + val e = E(C(B(1234))) + if (e.ax != 42) + return "Failed: ${e.ax}" + return "OK" +} diff --git a/compiler/testData/codegen/box/regressions/kt5445.kt b/compiler/testData/codegen/box/regressions/kt5445.kt index b5e906842fc..b48b0a64a98 100644 --- a/compiler/testData/codegen/box/regressions/kt5445.kt +++ b/compiler/testData/codegen/box/regressions/kt5445.kt @@ -1,5 +1,8 @@ // TARGET_BACKEND: JVM +// IGNORE_BACKEND_FIR: JVM_IR +// - FIR2IR should generate call to fake override + // WITH_RUNTIME // FILE: 1.kt diff --git a/compiler/testData/codegen/box/regressions/kt5445_2.kt b/compiler/testData/codegen/box/regressions/kt5445_2.kt index f98527129c9..eaaedcb0c22 100644 --- a/compiler/testData/codegen/box/regressions/kt5445_2.kt +++ b/compiler/testData/codegen/box/regressions/kt5445_2.kt @@ -1,5 +1,8 @@ // TARGET_BACKEND: JVM +// IGNORE_BACKEND_FIR: JVM_IR +// - FIR2IR should generate call to fake override + // WITH_RUNTIME // FILE: 1.kt diff --git a/compiler/testData/codegen/box/syntheticAccessors/jvmField.kt b/compiler/testData/codegen/box/syntheticAccessors/jvmField.kt index 76c38ef8d7e..be1f11c169b 100644 --- a/compiler/testData/codegen/box/syntheticAccessors/jvmField.kt +++ b/compiler/testData/codegen/box/syntheticAccessors/jvmField.kt @@ -1,6 +1,9 @@ // TARGET_BACKEND: JVM // WITH_RUNTIME +// IGNORE_BACKEND_FIR: JVM_IR +// - FIR2IR should generate call to fake override + // FILE: A.kt package a import b.* diff --git a/compiler/testData/codegen/box/syntheticAccessors/protectedMemberReferenceAccessor/kt46597_crossinline_jvmField_property.kt b/compiler/testData/codegen/box/syntheticAccessors/protectedMemberReferenceAccessor/kt46597_crossinline_jvmField_property.kt index 69b78cabeb0..2122cc60a4c 100644 --- a/compiler/testData/codegen/box/syntheticAccessors/protectedMemberReferenceAccessor/kt46597_crossinline_jvmField_property.kt +++ b/compiler/testData/codegen/box/syntheticAccessors/protectedMemberReferenceAccessor/kt46597_crossinline_jvmField_property.kt @@ -1,6 +1,9 @@ // TARGET_BACKEND: JVM // WITH_RUNTIME +// IGNORE_BACKEND_FIR: JVM_IR +// - FIR2IR should generate call to fake override + // FILE: a.kt package a diff --git a/compiler/testData/codegen/box/syntheticAccessors/protectedMemberReferenceAccessor/kt46597_jvmField_property.kt b/compiler/testData/codegen/box/syntheticAccessors/protectedMemberReferenceAccessor/kt46597_jvmField_property.kt index df39d043855..a3e3f9862a7 100644 --- a/compiler/testData/codegen/box/syntheticAccessors/protectedMemberReferenceAccessor/kt46597_jvmField_property.kt +++ b/compiler/testData/codegen/box/syntheticAccessors/protectedMemberReferenceAccessor/kt46597_jvmField_property.kt @@ -1,6 +1,9 @@ // TARGET_BACKEND: JVM // WITH_RUNTIME +// IGNORE_BACKEND_FIR: JVM_IR +// - FIR2IR should generate call to fake override + // FILE: a.kt package a diff --git a/compiler/testData/codegen/bytecodeListing/kt47328.kt b/compiler/testData/codegen/bytecodeListing/kt47328.kt new file mode 100644 index 00000000000..7253607c8fc --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/kt47328.kt @@ -0,0 +1,9 @@ +// WITH_RUNTIME + +interface A { val x: Int } + +class B(@JvmField override val x: Int): A + +class C(@JvmField val d: D) + +class E(c: C) { val ax = c.d.x } diff --git a/compiler/testData/codegen/bytecodeListing/kt47328.txt b/compiler/testData/codegen/bytecodeListing/kt47328.txt new file mode 100644 index 00000000000..92ed26f43d9 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/kt47328.txt @@ -0,0 +1,27 @@ +@kotlin.Metadata +public interface A { + // source: 'kt47328.kt' + public abstract method getX(): int +} + +@kotlin.Metadata +public final class B { + // source: 'kt47328.kt' + public final @kotlin.jvm.JvmField field x: int + public method (p0: int): void +} + +@kotlin.Metadata +public final class C { + // source: 'kt47328.kt' + public final @kotlin.jvm.JvmField @org.jetbrains.annotations.NotNull field d: A + public method (@org.jetbrains.annotations.NotNull p0: A): void +} + +@kotlin.Metadata +public final class E { + // source: 'kt47328.kt' + private final field ax: int + public method (@org.jetbrains.annotations.NotNull p0: C): void + public final method getAx(): int +} diff --git a/compiler/testData/ir/irText/expressions/kt47328.fir.txt b/compiler/testData/ir/irText/expressions/kt47328.fir.txt new file mode 100644 index 00000000000..2f2b7f84976 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt47328.fir.txt @@ -0,0 +1,124 @@ +FILE fqName: fileName:/kt47328.kt + CLASS INTERFACE name:A modality:ABSTRACT visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.A + PROPERTY name:x visibility:public modality:ABSTRACT [val] + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT <> ($this:.A) returnType:kotlin.Int + correspondingProperty: PROPERTY name:x visibility:public modality:ABSTRACT [val] + $this: VALUE_PARAMETER name: type:.A + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + CLASS CLASS name:B modality:FINAL visibility:public superTypes:[.A] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.B + CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:.B [primary] + VALUE_PARAMETER name:x index:0 type:kotlin.Int + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:B modality:FINAL visibility:public superTypes:[.A]' + PROPERTY name:x visibility:public modality:FINAL [val] + overridden: + public abstract x: kotlin.Int [val] + FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public [final] + annotations: + JvmField + EXPRESSION_BODY + GET_VAR 'x: kotlin.Int declared in .B.' type=kotlin.Int origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.B) returnType:kotlin.Int + correspondingProperty: PROPERTY name:x visibility:public modality:FINAL [val] + overridden: + public abstract fun (): kotlin.Int declared in .A + $this: VALUE_PARAMETER name: type:.B + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in .B' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public [final]' type=kotlin.Int origin=null + receiver: GET_VAR ': .B declared in .B.' type=.B origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int [fake_override] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String [fake_override] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any + CLASS CLASS name:C modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.C.C> + TYPE_PARAMETER name:D index:0 variance: superTypes:[.A] + CONSTRUCTOR visibility:public <> (d:D of .C) returnType:.C.C> [primary] + VALUE_PARAMETER name:d index:0 type:D of .C + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:C modality:FINAL visibility:public superTypes:[kotlin.Any]' + PROPERTY name:d visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:d type:D of .C visibility:public [final] + annotations: + JvmField + EXPRESSION_BODY + GET_VAR 'd: D of .C declared in .C.' type=D of .C origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.C.C>) returnType:D of .C + correspondingProperty: PROPERTY name:d visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.C.C> + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): D of .C declared in .C' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:d type:D of .C visibility:public [final]' type=D of .C origin=null + receiver: GET_VAR ': .C.C> declared in .C.' type=.C.C> origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + CLASS CLASS name:E modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.E + CONSTRUCTOR visibility:public <> (c:.C<.B>) returnType:.E [primary] + VALUE_PARAMETER name:c index:0 type:.C<.B> + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:E modality:FINAL visibility:public superTypes:[kotlin.Any]' + PROPERTY name:ax visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:ax type:kotlin.Int visibility:private [final] + EXPRESSION_BODY + CALL 'public final fun (): kotlin.Int declared in .B' type=kotlin.Int origin=GET_PROPERTY + $this: CALL 'public final fun (): D of .C declared in .C' type=.B origin=GET_PROPERTY + $this: GET_VAR 'c: .C<.B> declared in .E.' type=.C<.B> origin=null + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.E) returnType:kotlin.Int + correspondingProperty: PROPERTY name:ax visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.E + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in .E' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:ax type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null + receiver: GET_VAR ': .E declared in .E.' type=.E origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any diff --git a/compiler/testData/ir/irText/expressions/kt47328.kt b/compiler/testData/ir/irText/expressions/kt47328.kt new file mode 100644 index 00000000000..f99355d6413 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt47328.kt @@ -0,0 +1,11 @@ +// SKIP_KT_DUMP +// SKIP_KLIB_TEST +// WITH_RUNTIME + +interface A { val x: Int } + +class B(@JvmField override val x: Int): A + +class C(@JvmField val d: D) + +class E(c: C) { val ax = c.d.x } diff --git a/compiler/testData/ir/irText/expressions/kt47328.txt b/compiler/testData/ir/irText/expressions/kt47328.txt new file mode 100644 index 00000000000..21e3cbdd4f6 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt47328.txt @@ -0,0 +1,124 @@ +FILE fqName: fileName:/kt47328.kt + CLASS INTERFACE name:A modality:ABSTRACT visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.A + PROPERTY name:x visibility:public modality:ABSTRACT [val] + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:ABSTRACT <> ($this:.A) returnType:kotlin.Int + correspondingProperty: PROPERTY name:x visibility:public modality:ABSTRACT [val] + $this: VALUE_PARAMETER name: type:.A + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + CLASS CLASS name:B modality:FINAL visibility:public superTypes:[.A] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.B + CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:.B [primary] + VALUE_PARAMETER name:x index:0 type:kotlin.Int + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:B modality:FINAL visibility:public superTypes:[.A]' + PROPERTY name:x visibility:public modality:OPEN [val] + overridden: + public abstract x: kotlin.Int [val] + FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public [final] + annotations: + JvmField + EXPRESSION_BODY + GET_VAR 'x: kotlin.Int declared in .B.' type=kotlin.Int origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:OPEN <> ($this:.B) returnType:kotlin.Int + correspondingProperty: PROPERTY name:x visibility:public modality:OPEN [val] + overridden: + public abstract fun (): kotlin.Int declared in .A + $this: VALUE_PARAMETER name: type:.B + BLOCK_BODY + RETURN type=kotlin.Nothing from='public open fun (): kotlin.Int declared in .B' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:public [final]' type=kotlin.Int origin=null + receiver: GET_VAR ': .B declared in .B.' type=.B origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int [fake_override] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String [fake_override] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any + CLASS CLASS name:C modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.C.C> + TYPE_PARAMETER name:D index:0 variance: superTypes:[.A] + CONSTRUCTOR visibility:public <> (d:D of .C) returnType:.C.C> [primary] + VALUE_PARAMETER name:d index:0 type:D of .C + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:C modality:FINAL visibility:public superTypes:[kotlin.Any]' + PROPERTY name:d visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:d type:D of .C visibility:public [final] + annotations: + JvmField + EXPRESSION_BODY + GET_VAR 'd: D of .C declared in .C.' type=D of .C origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.C.C>) returnType:D of .C + correspondingProperty: PROPERTY name:d visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.C.C> + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): D of .C declared in .C' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:d type:D of .C visibility:public [final]' type=D of .C origin=null + receiver: GET_VAR ': .C.C> declared in .C.' type=.C.C> origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + CLASS CLASS name:E modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.E + CONSTRUCTOR visibility:public <> (c:.C<.B>) returnType:.E [primary] + VALUE_PARAMETER name:c index:0 type:.C<.B> + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:E modality:FINAL visibility:public superTypes:[kotlin.Any]' + PROPERTY name:ax visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:ax type:kotlin.Int visibility:private [final] + EXPRESSION_BODY + CALL 'public open fun (): kotlin.Int declared in .B' type=kotlin.Int origin=GET_PROPERTY + $this: CALL 'public final fun (): D of .C declared in .C' type=.B origin=GET_PROPERTY + $this: GET_VAR 'c: .C<.B> declared in .E.' type=.C<.B> origin=null + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.E) returnType:kotlin.Int + correspondingProperty: PROPERTY name:ax visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.E + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in .E' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:ax type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null + receiver: GET_VAR ': .E declared in .E.' type=.E origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any 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 3c0461fc98b..c8dc80ab802 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 @@ -24206,6 +24206,30 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/jvmField/interfaceCompanionWithJava.kt"); } + @Test + @TestMetadata("kt47328.kt") + public void testKt47328() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328.kt"); + } + + @Test + @TestMetadata("kt47328_inherited.kt") + public void testKt47328_inherited() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_inherited.kt"); + } + + @Test + @TestMetadata("kt47328_super.kt") + public void testKt47328_super() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_super.kt"); + } + + @Test + @TestMetadata("kt47328_var.kt") + public void testKt47328_var() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_var.kt"); + } + @Test @TestMetadata("publicField.kt") public void testPublicField() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java index e6486416f58..8581468d367 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java @@ -217,6 +217,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { runTest("compiler/testData/codegen/bytecodeListing/kt45934.kt"); } + @Test + @TestMetadata("kt47328.kt") + public void testKt47328() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/kt47328.kt"); + } + @Test @TestMetadata("noCollectionStubMethodsInInterface.kt") public void testNoCollectionStubMethodsInInterface() 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 5ef515f2b9f..04120a2d3ee 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 @@ -24242,6 +24242,30 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/jvmField/interfaceCompanionWithJava.kt"); } + @Test + @TestMetadata("kt47328.kt") + public void testKt47328() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328.kt"); + } + + @Test + @TestMetadata("kt47328_inherited.kt") + public void testKt47328_inherited() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_inherited.kt"); + } + + @Test + @TestMetadata("kt47328_super.kt") + public void testKt47328_super() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_super.kt"); + } + + @Test + @TestMetadata("kt47328_var.kt") + public void testKt47328_var() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_var.kt"); + } + @Test @TestMetadata("publicField.kt") public void testPublicField() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java index c9b67a1a73c..10f6a8240c0 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java @@ -217,6 +217,12 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes runTest("compiler/testData/codegen/bytecodeListing/kt45934.kt"); } + @Test + @TestMetadata("kt47328.kt") + public void testKt47328() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/kt47328.kt"); + } + @Test @TestMetadata("noCollectionStubMethodsInInterface.kt") public void testNoCollectionStubMethodsInInterface() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java index 283d2d8d053..34c27332858 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java @@ -1412,6 +1412,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest { runTest("compiler/testData/ir/irText/expressions/kt47245.kt"); } + @Test + @TestMetadata("kt47328.kt") + public void testKt47328() throws Exception { + runTest("compiler/testData/ir/irText/expressions/kt47328.kt"); + } + @Test @TestMetadata("lambdaInCAO.kt") public void testLambdaInCAO() 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 23ed4dad442..56585167a0b 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -20380,6 +20380,26 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/jvmField/interfaceCompanionWithJava.kt"); } + @TestMetadata("kt47328.kt") + public void testKt47328() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328.kt"); + } + + @TestMetadata("kt47328_inherited.kt") + public void testKt47328_inherited() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_inherited.kt"); + } + + @TestMetadata("kt47328_super.kt") + public void testKt47328_super() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_super.kt"); + } + + @TestMetadata("kt47328_var.kt") + public void testKt47328_var() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/kt47328_var.kt"); + } + @TestMetadata("publicField.kt") public void testPublicField() throws Exception { runTest("compiler/testData/codegen/box/jvmField/publicField.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/ir/KlibTextTestCaseGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/ir/KlibTextTestCaseGenerated.java index 494dc6c0b84..ab81c670165 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/ir/KlibTextTestCaseGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/ir/KlibTextTestCaseGenerated.java @@ -1098,6 +1098,11 @@ public class KlibTextTestCaseGenerated extends AbstractKlibTextTestCase { runTest("compiler/testData/ir/irText/expressions/kt47245.kt"); } + @TestMetadata("kt47328.kt") + public void testKt47328() throws Exception { + runTest("compiler/testData/ir/irText/expressions/kt47328.kt"); + } + @TestMetadata("lambdaInCAO.kt") public void testLambdaInCAO() throws Exception { runTest("compiler/testData/ir/irText/expressions/lambdaInCAO.kt");