From 05527fbc9acd36e32bf7a5647b0e37999f317c4d Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Tue, 1 Oct 2019 12:49:48 -0700 Subject: [PATCH] Fix all IR element duplication warnings/errors in JVM IR. --- .../org/jetbrains/kotlin/backend/jvm/lower/ConstLowering.kt | 3 ++- .../kotlin/backend/jvm/lower/JvmBuiltinOptimizationLowering.kt | 2 +- .../backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstLowering.kt index 926af821790..f398f2ef96b 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstLowering.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrConst import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrGetField +import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -30,7 +31,7 @@ fun IrField.constantValue(implicitConst: Boolean = false): IrConst<*>? { // Kotlin fields are only inlined if explicitly `const` to avoid making the values part of the ABI. val inline = correspondingPropertySymbol?.owner?.isConst == true || (isStatic && isFinal && (origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB || implicitConst)) - return if (inline) initializer?.expression as? IrConst<*> else null + return if (inline) (initializer?.expression as? IrConst<*>)?.copy() else null } class ConstLowering(val context: CommonBackendContext) : IrElementTransformerVoid(), FileLoweringPass { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmBuiltinOptimizationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmBuiltinOptimizationLowering.kt index 0e0d74f0b0d..883e6373329 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmBuiltinOptimizationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmBuiltinOptimizationLowering.kt @@ -272,7 +272,7 @@ class JvmBuiltinOptimizationLowering(val context: JvmBackendContext) : FileLower // initializer with the constant initializer. val variable = expression.symbol.owner return if (isImmutableTemporaryVariableWithConstantValue(variable)) - (variable as IrVariable).initializer!! + ((variable as IrVariable).initializer!! as IrConst<*>).copy() else expression } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt index 98b27513443..184558a9558 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl +import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.hasAnnotation import org.jetbrains.kotlin.ir.util.isObject import org.jetbrains.kotlin.ir.util.patchDeclarationParents @@ -224,7 +225,7 @@ private class MoveOrCopyCompanionObjectFieldsLowering(val context: CommonBackend if (oldInitializer != null) { field.initializer = oldInitializer .replaceThisByStaticReference(context, propertyParent, propertyParent.thisReceiver!!) - .patchDeclarationParents(field) as IrExpressionBody + .deepCopyWithSymbols(field) as IrExpressionBody } return field