diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt index a983c1c547c..52a69d6f174 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol +import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor import org.jetbrains.kotlin.ir.IrBuiltIns @@ -197,7 +198,7 @@ class Fir2IrImplicitCastInserter( // ================================================================================== - internal fun IrExpression.cast(expression: FirExpression, valueType: FirTypeRef, expectedType: FirTypeRef): IrExpression { + internal fun IrExpression.cast(expression: FirExpression, valueTypeRef: FirTypeRef, expectedTypeRef: FirTypeRef): IrExpression { if (this is IrTypeOperatorCall) { return this } @@ -206,12 +207,15 @@ class Fir2IrImplicitCastInserter( insertImplicitCasts() } + val valueType = valueTypeRef.coneTypeSafe()?.fullyExpandedType(session) ?: return this + val expectedType = expectedTypeRef.coneTypeSafe()?.fullyExpandedType(session) ?: return this + return when { expectedType.isUnit -> { coerceToUnitIfNeeded(this, irBuiltIns) } - valueType.coneTypeSafe() != null -> { - if (expectedType.coneType !is ConeDynamicType && !expectedType.isNullableAny) { + valueType is ConeDynamicType -> { + if (expectedType !is ConeDynamicType && !expectedType.isNullableAny) { implicitCast(this, expectedType.toIrType(ConversionTypeContext.DEFAULT)) } else { this @@ -226,8 +230,9 @@ class Fir2IrImplicitCastInserter( } } - private fun FirTypeRef.acceptsNullValues(): Boolean = - canBeNull || hasEnhancedNullability() + private fun ConeKotlinType.acceptsNullValues(): Boolean { + return canBeNull || hasEnhancedNullability + } private fun IrExpression.insertImplicitNotNullCastIfNeeded(expression: FirExpression): IrExpression { if (this is IrGetEnumValue) return this @@ -365,17 +370,18 @@ class Fir2IrImplicitCastInserter( ) } - internal fun typeCanBeEnhancedOrFlexibleNullable(typeRef: FirTypeRef): Boolean { + internal fun typeCanBeEnhancedOrFlexibleNullable(type: ConeKotlinType): Boolean { return when { - typeRef.hasEnhancedNullability() -> true - typeRef.isNullabilityFlexible() && typeRef.canBeNull -> true + type.hasEnhancedNullability -> true + type.hasFlexibleNullability && type.canBeNull -> true else -> false } } - private fun FirTypeRef.isNullabilityFlexible(): Boolean { - val flexibility = coneTypeSafe() ?: return false - return flexibility.lowerBound.isMarkedNullable != flexibility.upperBound.isMarkedNullable - } + private val ConeKotlinType.hasFlexibleNullability: Boolean + get() { + if (this !is ConeFlexibleType) return false + return lowerBound.isMarkedNullable != upperBound.isMarkedNullable + } } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt index d45f21c842e..d7fdac719f8 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt @@ -53,7 +53,7 @@ class DelegatedMemberGenerator(private val components: Fir2IrComponents) : Fir2I fun generateBodies() { for ((declaration, irField, delegateToSymbol, delegateToLookupTag) in bodiesInfo) { - val callTypeCanBeNullable = Fir2IrImplicitCastInserter.typeCanBeEnhancedOrFlexibleNullable(delegateToSymbol.fir.returnTypeRef) + val callTypeCanBeNullable = Fir2IrImplicitCastInserter.typeCanBeEnhancedOrFlexibleNullable(delegateToSymbol.fir.returnTypeRef.coneType.fullyExpandedType(session)) when (declaration) { is IrSimpleFunction -> { val member = declarationStorage.getIrFunctionSymbol( diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index c8f1fe7fcbf..6ac2bb7c9e2 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -18489,6 +18489,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/fir/flexibleIntegerLiterals.kt"); } + @Test + @TestMetadata("flexibleStaticConstantFromJava.kt") + public void testFlexibleStaticConstantFromJava() throws Exception { + runTest("compiler/testData/codegen/box/fir/flexibleStaticConstantFromJava.kt"); + } + @Test @TestMetadata("getOnNullableTypeAlias.kt") public void testGetOnNullableTypeAlias() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 12b54d63dd6..1fcced9b3ed 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -18489,6 +18489,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/fir/flexibleIntegerLiterals.kt"); } + @Test + @TestMetadata("flexibleStaticConstantFromJava.kt") + public void testFlexibleStaticConstantFromJava() throws Exception { + runTest("compiler/testData/codegen/box/fir/flexibleStaticConstantFromJava.kt"); + } + @Test @TestMetadata("getOnNullableTypeAlias.kt") public void testGetOnNullableTypeAlias() throws Exception { diff --git a/compiler/testData/codegen/box/fir/flexibleStaticConstantFromJava.kt b/compiler/testData/codegen/box/fir/flexibleStaticConstantFromJava.kt new file mode 100644 index 00000000000..f9830093d8b --- /dev/null +++ b/compiler/testData/codegen/box/fir/flexibleStaticConstantFromJava.kt @@ -0,0 +1,19 @@ +// TARGET_BACKEND: JVM +// ISSUE: KT-59461 + +// FILE: NullContainer.java +public interface NullContainer { + static String NULL = null; +} + +// FILE: main.kt +typealias NullableString = String? + +fun updateThreadContext(): NullableString { + return NullContainer.NULL +} + +fun box(): String { + updateThreadContext() + return "OK" +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index bf96f0396b8..2d3b7c95444 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -17667,6 +17667,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/fir/flexibleIntegerLiterals.kt"); } + @Test + @TestMetadata("flexibleStaticConstantFromJava.kt") + public void testFlexibleStaticConstantFromJava() throws Exception { + runTest("compiler/testData/codegen/box/fir/flexibleStaticConstantFromJava.kt"); + } + @Test @TestMetadata("incorrectBytecodeWithEnhancedNullability.kt") public void testIncorrectBytecodeWithEnhancedNullability() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 7b62a6bb0f5..ef2a04dbc11 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -18489,6 +18489,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fir/flexibleIntegerLiterals.kt"); } + @Test + @TestMetadata("flexibleStaticConstantFromJava.kt") + public void testFlexibleStaticConstantFromJava() throws Exception { + runTest("compiler/testData/codegen/box/fir/flexibleStaticConstantFromJava.kt"); + } + @Test @TestMetadata("getOnNullableTypeAlias.kt") public void testGetOnNullableTypeAlias() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index 21d57a239eb..9454d882cc7 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -18489,6 +18489,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/fir/flexibleIntegerLiterals.kt"); } + @Test + @TestMetadata("flexibleStaticConstantFromJava.kt") + public void testFlexibleStaticConstantFromJava() throws Exception { + runTest("compiler/testData/codegen/box/fir/flexibleStaticConstantFromJava.kt"); + } + @Test @TestMetadata("getOnNullableTypeAlias.kt") public void testGetOnNullableTypeAlias() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 38fbf3ed523..48b4b790678 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -14673,6 +14673,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/fir/flexibleIntegerLiterals.kt"); } + @TestMetadata("flexibleStaticConstantFromJava.kt") + public void testFlexibleStaticConstantFromJava() throws Exception { + runTest("compiler/testData/codegen/box/fir/flexibleStaticConstantFromJava.kt"); + } + @TestMetadata("incorrectBytecodeWithEnhancedNullability.kt") public void testIncorrectBytecodeWithEnhancedNullability() throws Exception { runTest("compiler/testData/codegen/box/fir/incorrectBytecodeWithEnhancedNullability.kt");