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 e0d0bddfcd2..be978a878ef 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 @@ -33467,6 +33467,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() 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 0f3905edd25..4b757453b43 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 @@ -33467,6 +33467,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt index bb004ee261d..9a5a4e67931 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt @@ -15,12 +15,16 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.IrDynamicType import org.jetbrains.kotlin.ir.types.classifierOrFail +import org.jetbrains.kotlin.ir.types.isNullable import org.jetbrains.kotlin.ir.util.hasAnnotation import org.jetbrains.kotlin.ir.util.kotlinFqName import org.jetbrains.kotlin.ir.util.module import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.resolve.multiplatform.OptionalAnnotationUtil +private val FLEXIBLE_NULLABILITY_ANNOTATION_FQ_NAME = StandardClassIds.Annotations.FlexibleNullability.asSingleFqName() + internal fun Map>.getMatches( expectDeclaration: IrDeclaration, expectActualTypesMap: Map, @@ -44,7 +48,7 @@ private inline fun List.getMatches( } private fun IrFunction.match(actualFunction: IrFunction, expectActualTypesMap: Map): Boolean { - fun getActualizedValueParameterSymbol( + fun getActualizedTypeClassifierSymbol( expectParameter: IrValueParameter, localTypeParametersMap: Map? = null ): IrSymbol { @@ -74,8 +78,15 @@ private fun IrFunction.match(actualFunction: IrFunction, expectActualTypesMap: M return true } - if (getActualizedValueParameterSymbol(expectParameter, localTypeParametersMap) != - getActualizedValueParameterSymbol(actualParameter) + if (expectParameter.type.isNullable() != actualParameter.type.isNullable() && + !expectParameter.type.annotations.hasAnnotation(FLEXIBLE_NULLABILITY_ANNOTATION_FQ_NAME) && + !actualParameter.type.annotations.hasAnnotation(FLEXIBLE_NULLABILITY_ANNOTATION_FQ_NAME) + ) { + return false + } + + if (getActualizedTypeClassifierSymbol(expectParameter, localTypeParametersMap) != + getActualizedTypeClassifierSymbol(actualParameter) ) { return false } diff --git a/compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt b/compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt new file mode 100644 index 00000000000..9e32d42515e --- /dev/null +++ b/compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt @@ -0,0 +1,20 @@ +// IGNORE_BACKEND: JVM, JVM_IR +// IGNORE_BACKEND_K1: JS, JS_IR, JS_IR_ES6, NATIVE +// !LANGUAGE: +MultiPlatformProjects + +// MODULE: common +// FILE: common.kt + +expect fun o(x: String?): String? +expect fun k(x: String?): String? + +fun box() = o(null) + k(null) + +// MODULE: platform()()(common) +// FILE: platform.kt + +fun o(x: String) = "" +actual fun o(x: String?): String? = "O" + +actual fun k(x: String?): String? = "K" +fun k(x: String) = "" \ No newline at end of file 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 6c5d42f587d..1be96c45c61 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 @@ -32027,6 +32027,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() 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 1be8b019447..6f8f4eb94d3 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 @@ -33467,6 +33467,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() 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 ca19944723d..e17c3304fbb 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 @@ -33467,6 +33467,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() 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 1dabb85dd6a..9c8513697e3 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -27225,6 +27225,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class Basic extends AbstractLightAnalysisModeTest { + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void ignoreExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @TestMetadata("expectProperty.kt") public void ignoreExpectProperty() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index a9a0fb0fc23..744fc2ded4e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -23245,6 +23245,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java index 505a1a55938..b25d25b621e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java @@ -23383,6 +23383,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index 43d7b4deaec..132c13d81fb 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -23383,6 +23383,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java index 2d57bf2f461..ab1fda601b8 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java @@ -23383,6 +23383,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java index 0da4c69fe13..33050b961c2 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java @@ -26809,6 +26809,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java index e777f560faa..52cbac46483 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java @@ -27419,6 +27419,12 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index 7df8f4cc991..e662e2ec8e5 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -26504,6 +26504,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java index a4d6c89e6c0..db1c3df918f 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java @@ -27114,6 +27114,12 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @Test + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @Test @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() throws Exception { diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java index 40a31c0e99d..bc54b157966 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java @@ -20811,6 +20811,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); } + @TestMetadata("expectActualNullabilityBasedOverloads.kt") + public void testExpectActualNullabilityBasedOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt"); + } + @TestMetadata("expectActualOverloads.kt") public void testExpectActualOverloads() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualOverloads.kt");