diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt index 62790b06dd9..528d2b7422a 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt @@ -25,9 +25,16 @@ import org.jetbrains.kotlin.types.typeUtil.makeNullable typealias ReportError = (element: IrElement, message: String) -> Unit -class CheckIrElementVisitor(val builtIns: KotlinBuiltIns, val reportError: ReportError) : IrElementVisitorVoid { +class CheckIrElementVisitor(val builtIns: KotlinBuiltIns, val reportError: ReportError, val ensureAllNodesAreDifferent: Boolean) : IrElementVisitorVoid { + + val set = mutableSetOf() override fun visitElement(element: IrElement) { + if (ensureAllNodesAreDifferent) { + if (set.contains(element)) + reportError(element, "Duplicate IR node") + set.add(element) + } // Nothing to do. } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/IrValidator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/IrValidator.kt index 3c50396a18b..aa4ffc6ea2a 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/IrValidator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/IrValidator.kt @@ -28,17 +28,17 @@ import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.resolve.descriptorUtil.module fun validateIrFunction(context: BackendContext, irFunction: IrFunction) { - val visitor = IrValidator(context) + val visitor = IrValidator(context, false) irFunction.acceptVoid(visitor) } fun validateIrFile(context: BackendContext, irFile: IrFile) { - val visitor = IrValidator(context) + val visitor = IrValidator(context, false) irFile.acceptVoid(visitor) } fun validateIrModule(context: BackendContext, irModule: IrModuleFragment) { - val visitor = IrValidator(context) + val visitor = IrValidator(context, true) // TODO: consider taking the boolean from settings. irModule.acceptVoid(visitor) // TODO: investigate and re-enable @@ -180,7 +180,7 @@ private class Declarations { } } -private class IrValidator(val context: BackendContext) : IrElementVisitorVoid { +private class IrValidator(val context: BackendContext, performHeavyValidations: Boolean) : IrElementVisitorVoid { val foundDeclarations = Declarations() @@ -200,7 +200,7 @@ private class IrValidator(val context: BackendContext) : IrElementVisitorVoid { currentFile, element) } - private val elementChecker = CheckIrElementVisitor(builtIns, this::error) + private val elementChecker = CheckIrElementVisitor(builtIns, this::error, performHeavyValidations) override fun visitElement(element: IrElement) { element.acceptVoid(elementChecker)