JVM IR: keep property for $receiver field of optimized delegated properties
For properties which delegate to other property via the getValue operator from stdlib (see KT-39054), we generate `$receiver` field which stores the receiver of the property reference used in the delegate. The problem was that this backing field was missing `correspondingProperty`. It's needed because it is used as a map key to store static fields in `JvmCachedDeclarations.getStaticBackingField`. If it's null, accesses to the static $receiver fields are not remapped correctly in `RemapObjectFieldAccesses` and `MoveOrCopyCompanionObjectFieldsLowering`, which led to ICCE or NSFE. #KT-49793 Fixed
This commit is contained in:
+18
@@ -13997,6 +13997,24 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_companionObject.kt")
|
||||||
|
public void testKt49793_companionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_companionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_interfaceCompanionObject.kt")
|
||||||
|
public void testKt49793_interfaceCompanionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_interfaceCompanionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_object.kt")
|
||||||
|
public void testKt49793_object() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_object.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mutable.kt")
|
@TestMetadata("mutable.kt")
|
||||||
public void testMutable() throws Exception {
|
public void testMutable() throws Exception {
|
||||||
|
|||||||
+1
@@ -145,6 +145,7 @@ private class PropertyReferenceDelegationTransformer(val context: JvmBackendCont
|
|||||||
}.apply {
|
}.apply {
|
||||||
parent = oldField.parent
|
parent = oldField.parent
|
||||||
initializer = context.irFactory.createExpressionBody(it)
|
initializer = context.irFactory.createExpressionBody(it)
|
||||||
|
correspondingPropertySymbol = oldField.correspondingPropertySymbol
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val originalThis = parentAsClass.thisReceiver
|
val originalThis = parentAsClass.thisReceiver
|
||||||
|
|||||||
Vendored
+14
@@ -0,0 +1,14 @@
|
|||||||
|
// WITH_STDLIB
|
||||||
|
|
||||||
|
class Z(val x: String = "OK")
|
||||||
|
|
||||||
|
operator fun Z.getValue(x: Any?, y: Any?): Z = this
|
||||||
|
|
||||||
|
class O {
|
||||||
|
companion object {
|
||||||
|
val instance: Z by Z()
|
||||||
|
val y by instance::x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String = O.y
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
// WITH_STDLIB
|
||||||
|
|
||||||
|
class Z(var x: String = "Fail")
|
||||||
|
|
||||||
|
operator fun Z.getValue(x: Any?, y: Any?): Z = this
|
||||||
|
operator fun Z.setValue(x: Any?, y: Any?, value: Z) { this.x = value.x }
|
||||||
|
|
||||||
|
interface O {
|
||||||
|
companion object {
|
||||||
|
val instance: Z by Z()
|
||||||
|
var y by instance::x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
O.y = "OK"
|
||||||
|
return O.y
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
// WITH_STDLIB
|
||||||
|
|
||||||
|
class Z(val x: String = "OK")
|
||||||
|
|
||||||
|
operator fun Z.getValue(x: Any?, y: Any?): Z = this
|
||||||
|
|
||||||
|
object O {
|
||||||
|
val instance: Z by Z()
|
||||||
|
val y by instance::x
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String = O.y
|
||||||
+18
@@ -13919,6 +13919,24 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_companionObject.kt")
|
||||||
|
public void testKt49793_companionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_companionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_interfaceCompanionObject.kt")
|
||||||
|
public void testKt49793_interfaceCompanionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_interfaceCompanionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_object.kt")
|
||||||
|
public void testKt49793_object() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_object.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mutable.kt")
|
@TestMetadata("mutable.kt")
|
||||||
public void testMutable() throws Exception {
|
public void testMutable() throws Exception {
|
||||||
|
|||||||
+18
@@ -13997,6 +13997,24 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_companionObject.kt")
|
||||||
|
public void testKt49793_companionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_companionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_interfaceCompanionObject.kt")
|
||||||
|
public void testKt49793_interfaceCompanionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_interfaceCompanionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_object.kt")
|
||||||
|
public void testKt49793_object() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_object.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mutable.kt")
|
@TestMetadata("mutable.kt")
|
||||||
public void testMutable() throws Exception {
|
public void testMutable() throws Exception {
|
||||||
|
|||||||
+15
@@ -11336,6 +11336,21 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt49793_companionObject.kt")
|
||||||
|
public void testKt49793_companionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_companionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt49793_interfaceCompanionObject.kt")
|
||||||
|
public void testKt49793_interfaceCompanionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_interfaceCompanionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt49793_object.kt")
|
||||||
|
public void testKt49793_object() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_object.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("mutable.kt")
|
@TestMetadata("mutable.kt")
|
||||||
public void testMutable() throws Exception {
|
public void testMutable() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/mutable.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/mutable.kt");
|
||||||
|
|||||||
+18
@@ -10663,6 +10663,24 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/custom.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/custom.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_companionObject.kt")
|
||||||
|
public void testKt49793_companionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_companionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_interfaceCompanionObject.kt")
|
||||||
|
public void testKt49793_interfaceCompanionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_interfaceCompanionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_object.kt")
|
||||||
|
public void testKt49793_object() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_object.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mutable.kt")
|
@TestMetadata("mutable.kt")
|
||||||
public void testMutable() throws Exception {
|
public void testMutable() throws Exception {
|
||||||
|
|||||||
+18
@@ -10705,6 +10705,24 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/custom.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/custom.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_companionObject.kt")
|
||||||
|
public void testKt49793_companionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_companionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_interfaceCompanionObject.kt")
|
||||||
|
public void testKt49793_interfaceCompanionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_interfaceCompanionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_object.kt")
|
||||||
|
public void testKt49793_object() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_object.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mutable.kt")
|
@TestMetadata("mutable.kt")
|
||||||
public void testMutable() throws Exception {
|
public void testMutable() throws Exception {
|
||||||
|
|||||||
+18
@@ -14148,6 +14148,24 @@ public class NativeExtBlackBoxTestGenerated extends AbstractNativeBlackBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_companionObject.kt")
|
||||||
|
public void testKt49793_companionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_companionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_interfaceCompanionObject.kt")
|
||||||
|
public void testKt49793_interfaceCompanionObject() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_interfaceCompanionObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt49793_object.kt")
|
||||||
|
public void testKt49793_object() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToAnother/kt49793_object.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mutable.kt")
|
@TestMetadata("mutable.kt")
|
||||||
public void testMutable() throws Exception {
|
public void testMutable() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user