diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index 02ec6a6ee38..ab0c4f00597 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -289,8 +289,14 @@ open class FirTypeResolveTransformer( if (visited.isNotEmpty() && currentTypeParameter == typeParameter) return true if (!visited.add(currentTypeParameter)) return false + fun ConeKotlinType.toNextTypeParameter(): FirTypeParameter? = when (this) { + is ConeTypeParameterType -> lookupTag.typeParameterSymbol.fir + is ConeDefinitelyNotNullType -> original.toNextTypeParameter() + else -> null + } + return currentTypeParameter.bounds.any { - val nextTypeParameter = it.coneTypeSafe()?.lookupTag?.typeParameterSymbol?.fir ?: return@any false + val nextTypeParameter = it.coneTypeOrNull?.toNextTypeParameter() ?: return@any false hasSupertypePathToParameter(nextTypeParameter, typeParameter, visited) } diff --git a/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.fir.kt b/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.fir.kt index 4d8c217b91d..ad2fcc32300 100644 --- a/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.fir.kt +++ b/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.fir.kt @@ -8,4 +8,5 @@ class A2?> fun bar() {} -fun <E : E & Any> baz() {} +fun <E : E & Any> baz1() {} +fun <E : E & Any> E?.baz2() {} diff --git a/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.kt b/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.kt index 5851f0dcd6e..a893e06ae04 100644 --- a/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.kt +++ b/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.kt @@ -8,4 +8,5 @@ class A2K & Any>? fun bar() {} -fun <E : E & Any> baz() {} +fun <E : E & Any> baz1() {} +fun <E : E & Any> E?.baz2() {} diff --git a/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.txt b/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.txt index 26d55b3e4b3..313a69acc3b 100644 --- a/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.txt +++ b/compiler/testData/diagnostics/tests/explicitDefinitelyNotNullableViaIntersection/recursiveBounds.txt @@ -1,9 +1,10 @@ package public fun bar(): kotlin.Unit -public fun baz(): kotlin.Unit +public fun baz1(): kotlin.Unit public fun > sort1(): kotlin.Unit public fun ?> sort2(): kotlin.Unit +public fun [Error type: Error type parameter]?.baz2(): kotlin.Unit public final class A1> { public constructor A1>()