diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index c0677e6485b..d27c72e5437 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -289,12 +289,13 @@ internal tailrec fun FirCallableSymbol<*>.deepestMatchingOverriddenSymbol(root: internal fun IrClass.findMatchingOverriddenSymbolsFromSupertypes( irBuiltIns: IrBuiltIns, target: IrDeclaration, - result: MutableList = mutableListOf() + result: MutableList = mutableListOf(), + visited: MutableSet = mutableSetOf() ): List { for (superType in superTypes) { val superTypeClass = superType.classOrNull if (superTypeClass is IrClassSymbolImpl) { - superTypeClass.owner.findMatchingOverriddenSymbolsFromThisAndSupertypes(irBuiltIns, target, result) + superTypeClass.owner.findMatchingOverriddenSymbolsFromThisAndSupertypes(irBuiltIns, target, result, visited) } } return result @@ -303,8 +304,13 @@ internal fun IrClass.findMatchingOverriddenSymbolsFromSupertypes( private fun IrClass.findMatchingOverriddenSymbolsFromThisAndSupertypes( irBuiltIns: IrBuiltIns, target: IrDeclaration, - result: MutableList + result: MutableList, + visited: MutableSet ): List { + if (this in visited) { + return result + } + visited += this val targetIsPropertyAccessor = target is IrFunction && target.isPropertyAccessor for (declaration in declarations) { if (declaration.isFakeOverride || declaration is IrConstructor) { @@ -355,7 +361,7 @@ private fun IrClass.findMatchingOverriddenSymbolsFromThisAndSupertypes( if (result.isNotEmpty()) { return result } - return findMatchingOverriddenSymbolsFromSupertypes(irBuiltIns, target, result) + return findMatchingOverriddenSymbolsFromSupertypes(irBuiltIns, target, result, visited) } fun isOverriding(