diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 592ce93ff97..e3d3821dca7 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -535,6 +535,11 @@ class Fir2IrClassifierStorage( ): IrEnumEntry { return enumEntry.convertWithOffsets { startOffset, endOffset -> val signature = signatureComposer.composeSignature(enumEntry, forceTopLevelPrivate = forceTopLevelPrivate) + if (signature != null) { + // Compilation of kotlinx-serialization-protobuf fails with "already bound" exception if this check is removed + // TODO: get rid of this check + symbolTable.referenceEnumEntryIfAny(signature)?.let { if (it.isBound) return@convertWithOffsets it.owner } + } val result = declareIrEnumEntry(signature) { symbol -> val origin = enumEntry.computeIrOrigin(predefinedOrigin) irFactory.createEnumEntry( diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index 3d41b2b844b..5d0f66e01ef 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -664,6 +664,10 @@ open class SymbolTable( else IrEnumEntrySymbolImpl() } + fun referenceEnumEntryIfAny(sig: IdSignature): IrEnumEntrySymbol? { + return enumEntrySymbolTable.get(sig) + } + val unboundEnumEntries: Set get() = enumEntrySymbolTable.unboundSymbols private fun createFieldSymbol(descriptor: PropertyDescriptor, signature: IdSignature?): IrFieldSymbol =