diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityDeclarationChecker.kt index b968ff4e019..87d8fb40597 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityDeclarationChecker.kt @@ -218,9 +218,17 @@ object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() { private fun ConeKotlinType.findVisibilityExposure( context: CheckerContext, - base: EffectiveVisibility + base: EffectiveVisibility, + visitedTypes: MutableSet = mutableSetOf(), ): Pair, EffectiveVisibility>? { - val type = this as? ConeClassLikeType ?: return null + if (!visitedTypes.add(this)) return null + + val type = when (this) { + is ConeClassLikeType -> this + is ConeFlexibleType -> lowerBound as? ConeClassLikeType ?: return null + else -> return null + } + val classSymbol = type.fullyExpandedType(context.session).lookupTag.toSymbol(context.session) ?: return null val effectiveVisibility = when (classSymbol) { @@ -239,9 +247,14 @@ object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() { } } - for (it in type.typeArguments) { - (it as? ConeClassLikeType)?.findVisibilityExposure(context, base)?.let { - return it + for ((index, it) in type.typeArguments.withIndex()) { + when (it) { + is ConeClassLikeType -> it.findVisibilityExposure(context, base, visitedTypes)?.let { return it } + is ConeStarProjection -> type.toRegularClassSymbol(context.session) + ?.typeParameterSymbols?.getOrNull(index) + ?.resolvedBounds?.firstNotNullOfOrNull { it.type.findVisibilityExposure(context, base, visitedTypes) } + ?.let { return it } + else -> {} } } diff --git a/compiler/testData/diagnostics/tests/exposed/packagePrivate.fir.kt b/compiler/testData/diagnostics/tests/exposed/packagePrivate.fir.kt index f99a0622b36..61575e93b80 100644 --- a/compiler/testData/diagnostics/tests/exposed/packagePrivate.fir.kt +++ b/compiler/testData/diagnostics/tests/exposed/packagePrivate.fir.kt @@ -19,9 +19,9 @@ class His { // Ok: internal vs package-private in same package internal fun internal() = My.foo() // Error: protected vs package-private - protected fun protected() = My.foo() + protected fun protected() = My.foo() // Error: public vs package-private - fun public() = My.foo() + fun public() = My.foo() } // FILE: other/Your.kt diff --git a/compiler/testData/diagnostics/tests/exposed/typeArgs.fir.kt b/compiler/testData/diagnostics/tests/exposed/typeArgs.fir.kt index 5fd5d12cb40..8831e61198c 100644 --- a/compiler/testData/diagnostics/tests/exposed/typeArgs.fir.kt +++ b/compiler/testData/diagnostics/tests/exposed/typeArgs.fir.kt @@ -13,5 +13,5 @@ interface GenericMy> interface Our { // invalid, Generic is effectively internal - fun foo(): Generic<*> -} \ No newline at end of file + fun foo(): Generic<*> +}