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 1e61d92e23d..548cd63aea2 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 @@ -406,6 +406,7 @@ internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(containingClass processOverriddenFunctionSymbols(containingClass) { for (overridden in fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses)) { + assert(overridden != symbol) { "Cannot add function $overridden to its own overriddenSymbols" } overriddenSet += overridden } } @@ -483,6 +484,7 @@ internal fun FirProperty.generateOverriddenPropertySymbols(containingClass: FirC processOverriddenPropertySymbols(containingClass) { for (overridden in fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses)) { + assert(overridden != symbol) { "Cannot add property $overridden to its own overriddenSymbols" } overriddenSet += overridden } } @@ -510,6 +512,7 @@ internal fun FirProperty.generateOverriddenAccessorSymbols(containingClass: FirC if (isGetter) overriddenIrPropertySymbol.owner.getter?.symbol else overriddenIrPropertySymbol.owner.setter?.symbol if (overriddenIrAccessorSymbol != null) { + assert(overriddenIrAccessorSymbol != symbol) { "Cannot add property $overriddenIrAccessorSymbol to its own overriddenSymbols" } overriddenSet += overriddenIrAccessorSymbol } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt index 1978d17f77c..d859d577ca3 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt @@ -823,6 +823,7 @@ class IrBuiltInsOverFir( it.valueParameters.count() == fn.valueParameters.count() && it.valueParameters.zip(fn.valueParameters).all { (l, r) -> l.type == r.type } }?.let { + assert(it.symbol != fn) { "Cannot add function $fn to its own overriddenSymbols" } fn.overriddenSymbols += it.symbol } } @@ -939,6 +940,7 @@ class IrBuiltInsOverFir( // TODO: replace with correct logic or explicit specification if cases become more complex forEachSuperClass { properties.find { it.name == property.name }?.let { + assert(property != it.symbol) { "Cannot add property $property to its own overriddenSymbols"} property.overriddenSymbols += it.symbol } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt index b2bc0d872f5..2e91d931c0b 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt @@ -93,7 +93,10 @@ class Fir2IrLazySimpleFunction( fakeOverrideGenerator.calcBaseSymbolsForFakeOverrideFunction( firParent, this, fir.symbol ) - fakeOverrideGenerator.getOverriddenSymbolsForFakeOverride(this)?.let { return@lazyVar it } + fakeOverrideGenerator.getOverriddenSymbolsForFakeOverride(this)?.let { + assert(!it.contains(symbol)) { "Cannot add function $symbol to its own overriddenSymbols" } + return@lazyVar it + } } fir.generateOverriddenFunctionSymbols(firParent) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirObjCInterop.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirObjCInterop.kt index 3f87c96a9c8..db5cbd7a709 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirObjCInterop.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirObjCInterop.kt @@ -51,6 +51,7 @@ internal fun FirFunction.getObjCMethodInfoFromOverriddenFunctions(session: FirSe // call of `processFunctionsByName()` is needed only for necessary side-effect before `getDirectOverriddenFunctions` call unsubstitutedScope.processFunctionsByName(symbol.name) {} unsubstitutedScope.getDirectOverriddenFunctions(symbol).firstNotNullOfOrNull { + assert(it.fir != this) { "Function ${symbol.name}() is wrongly contained in its own getDirectOverriddenFunctions" } it.fir.getObjCMethodInfoFromOverriddenFunctions(session, scopeSession) } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt index 68ce56e9fc0..e3b2a8c4c88 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt @@ -179,7 +179,10 @@ private fun IrSimpleFunction.getObjCMethodInfo(onlyExternal: Boolean): ObjCMetho } } - return overriddenSymbols.firstNotNullOfOrNull { it.owner.getObjCMethodInfo(onlyExternal) } + return overriddenSymbols.firstNotNullOfOrNull { + assert(it.owner != this) { "Function ${it.owner.descriptor.fqNameSafe}() is wrongly contained in its own overriddenSymbols"} + it.owner.getObjCMethodInfo(onlyExternal) + } } fun FunctionDescriptor.getExternalObjCMethodInfo(): ObjCMethodInfo? = this.getObjCMethodInfo(onlyExternal = true)