diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/ifElvisReturn.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/ifElvisReturn.fir.txt index 6f331f220ed..26c712dade1 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/ifElvisReturn.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/inference/ifElvisReturn.fir.txt @@ -14,7 +14,7 @@ FILE: ifElvisReturn.kt R|/b| } else -> { - R|/materialize|() ?: ^foo Unit + R|/materialize|() ?: ^foo Unit } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt index 9c831996154..2a1256d7cfb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt @@ -243,6 +243,20 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran } } + session.typeContext.run { + if (result.typeRef.coneTypeSafe()?.isNullableType() == true + && result.rhs.typeRef.coneTypeSafe()?.isNullableType() == false + ) { + // Sometimes return type for special call for elvis operator might be nullable, + // but result is not nullable if the right type is not nullable + result.replaceTypeRef( + result.typeRef.withReplacedConeType(result.typeRef.coneType.makeConeTypeDefinitelyNotNullOrNotNull(session.typeContext)) + ) + } + } + + + dataFlowAnalyzer.exitElvis(elvisExpression) return result }