JVM_IR never generate setter synthetic accessor for 'val' field

KT-49316
This commit is contained in:
Dmitry Petrov
2021-10-28 18:04:45 +03:00
committed by TeamCityServer
parent d7ae7ca911
commit 4f0c3c3c0d
12 changed files with 147 additions and 12 deletions
@@ -42640,6 +42640,18 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/syntheticAccessors/kt48954.kt");
}
@Test
@TestMetadata("kt49316.kt")
public void testKt49316() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316.kt");
}
@Test
@TestMetadata("kt49316a.kt")
public void testKt49316a() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316a.kt");
}
@Test
@TestMetadata("kt9717.kt")
public void testKt9717() throws Exception {
@@ -58,6 +58,7 @@ private class SyntheticAccessorTransformer(
val inlineScopeResolver: IrInlineScopeResolver,
val pendingAccessorsToAdd: MutableList<IrFunction>
) : IrElementTransformerVoidWithContext() {
private data class FieldKey(val fieldSymbol: IrFieldSymbol, val parent: IrDeclarationParent, val superQualifierSymbol: IrClassSymbol?)
private data class FunctionKey(
@@ -245,21 +246,30 @@ private class SyntheticAccessorTransformer(
}
override fun visitSetField(expression: IrSetField): IrExpression {
// FE accepts code that assigns to a val of this or other class if it happens in unreachable code (KT-35565).
// Sometimes this can cause internal error in the BE (see KT-49316).
// Assume that 'val' property with a backing field can never be initialized from a context that requires synthetic accessor.
val correspondingProperty = expression.symbol.owner.correspondingPropertySymbol?.owner
if (correspondingProperty != null && !correspondingProperty.isVar) {
return super.visitExpression(expression)
}
val dispatchReceiverType = expression.receiver?.type
val dispatchReceiverClassSymbol = dispatchReceiverType?.classifierOrNull as? IrClassSymbol
if (expression.symbol.isAccessible(false, dispatchReceiverClassSymbol)) {
return super.visitExpression(expression)
}
val symbol = expression.symbol
val parent = symbol.owner.accessorParent(dispatchReceiverClassSymbol?.owner ?: symbol.owner.parent) as IrClass
return super.visitExpression(
if (!expression.symbol.isAccessible(false, dispatchReceiverClassSymbol)) {
val symbol = expression.symbol
val parent = symbol.owner.accessorParent(dispatchReceiverClassSymbol?.owner ?: symbol.owner.parent) as IrClass
modifySetterExpression(
expression,
setterMap.getOrPut(FieldKey(symbol, parent, expression.superQualifierSymbol)) {
makeSetterAccessorSymbol(symbol, parent, expression.superQualifierSymbol)
}
)
} else {
expression
}
modifySetterExpression(
expression,
setterMap.getOrPut(FieldKey(symbol, parent, expression.superQualifierSymbol)) {
makeSetterAccessorSymbol(symbol, parent, expression.superQualifierSymbol)
}
)
)
}
@@ -0,0 +1,27 @@
// IGNORE_BACKEND: JS
// java.lang.AssertionError
// at org.jetbrains.kotlin.js.translate.context.TranslationContext.getDispatchReceiver(TranslationContext.java:590)
// at org.jetbrains.kotlin.js.translate.utils.TranslationUtils.backingFieldReference(TranslationUtils.java:237)
// at org.jetbrains.kotlin.js.translate.utils.TranslationUtils.assignmentToBackingField(TranslationUtils.java:250)
// at org.jetbrains.kotlin.js.translate.reference.BackingFieldAccessTranslator.translateAsSet(BackingFieldAccessTranslator.java:60)
// ...
// FILE: kt49316.kt
import a.*
// This test should become irrelevant after KT-35565 is fixed.
fun test(foo: Foo): String {
return foo.s
// VAL_REASSIGNMENT not reported in unreachable code.
// Make sure there's no BE internal error here.
foo.s = "oops"
}
fun box() = test(Foo("OK"))
// FILE: Foo.kt
package a
class Foo(val s: String)
@@ -0,0 +1,17 @@
// TARGET_BACKEND: JVM
// This test should become irrelevant after KT-35565 is fixed.
fun test(foo: Foo): String {
return foo.s
// VAL_REASSIGNMENT not reported in unreachable code.
// Make sure there's no BE internal error here.
foo.s = "oops"
}
// CHECK_BYTECODE_LISTING
// - there should be no synthetic accessor generated in 'Foo'
class Foo(val s: String)
fun box() = test(Foo("OK"))
@@ -0,0 +1,14 @@
@kotlin.Metadata
public final class Foo {
// source: 'kt49316a.kt'
private final @org.jetbrains.annotations.NotNull field s: java.lang.String
public method <init>(@org.jetbrains.annotations.NotNull p0: java.lang.String): void
public final @org.jetbrains.annotations.NotNull method getS(): java.lang.String
}
@kotlin.Metadata
public final class Kt49316aKt {
// source: 'kt49316a.kt'
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static @org.jetbrains.annotations.NotNull method test(@org.jetbrains.annotations.NotNull p0: Foo): java.lang.String
}
@@ -42472,6 +42472,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt48954.kt");
}
@Test
@TestMetadata("kt49316.kt")
public void testKt49316() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316.kt");
}
@Test
@TestMetadata("kt49316a.kt")
public void testKt49316a() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316a.kt");
}
@Test
@TestMetadata("kt9717.kt")
public void testKt9717() throws Exception {
@@ -42640,6 +42640,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/syntheticAccessors/kt48954.kt");
}
@Test
@TestMetadata("kt49316.kt")
public void testKt49316() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316.kt");
}
@Test
@TestMetadata("kt49316a.kt")
public void testKt49316a() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316a.kt");
}
@Test
@TestMetadata("kt9717.kt")
public void testKt9717() throws Exception {
@@ -34207,6 +34207,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/syntheticAccessors/kt48954.kt");
}
@TestMetadata("kt49316.kt")
public void testKt49316() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316.kt");
}
@TestMetadata("kt49316a.kt")
public void testKt49316a() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316a.kt");
}
@TestMetadata("kt9717.kt")
public void testKt9717() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt9717.kt");
@@ -28382,6 +28382,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
runTest("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt");
}
@TestMetadata("kt49316.kt")
public void testKt49316() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316.kt");
}
@TestMetadata("kt9717.kt")
public void testKt9717() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt9717.kt");
@@ -27788,6 +27788,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt");
}
@TestMetadata("kt49316.kt")
public void testKt49316() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316.kt");
}
@TestMetadata("kt9717.kt")
public void testKt9717() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt9717.kt");
@@ -24142,6 +24142,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
runTest("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt");
}
@TestMetadata("kt49316.kt")
public void testKt49316() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316.kt");
}
@TestMetadata("kt9717.kt")
public void testKt9717() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt9717.kt");
@@ -30864,6 +30864,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt");
}
@Test
@TestMetadata("kt49316.kt")
public void testKt49316() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/kt49316.kt");
}
@Test
@TestMetadata("kt9717.kt")
public void testKt9717() throws Exception {