From 12b11bd034548d9982b4d3804630306ad8e9bdc1 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Thu, 30 Mar 2023 06:28:16 +0000 Subject: [PATCH] [FIR] KT-57568: Make K2 treat signed ints as more specific than unsigned This is the way it works in K1. See `OverloadingConflictResolver.kt:345`. ^KT-57568 Fixed Merge-request: KT-MR-9395 Merged-by: Nikolay Lunyak --- ...gnosticCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...dDiagnosticCompilerFE10TestDataTestGenerated.java | 6 ++++++ ...LightTreeOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../FirPsiOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../calls/AbstractConeCallConflictResolver.kt | 10 ++++++++++ .../ambiguityWithUnsignedSpecificity.kt | 12 ++++++++++++ .../kotlin/test/runners/DiagnosticTestGenerated.java | 6 ++++++ 7 files changed, 52 insertions(+) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/ambiguityWithUnsignedSpecificity.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index ef7670e7a6b..b4546139ac8 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -35299,6 +35299,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true, "native"); } + @Test + @TestMetadata("ambiguityWithUnsignedSpecificity.kt") + public void testAmbiguityWithUnsignedSpecificity() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/ambiguityWithUnsignedSpecificity.kt"); + } + @Test @TestMetadata("ArrayOfNothing.kt") public void testArrayOfNothing() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index d2ad5f4cfe0..6073708596e 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -35299,6 +35299,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true, "native"); } + @Test + @TestMetadata("ambiguityWithUnsignedSpecificity.kt") + public void testAmbiguityWithUnsignedSpecificity() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/ambiguityWithUnsignedSpecificity.kt"); + } + @Test @TestMetadata("ArrayOfNothing.kt") public void testArrayOfNothing() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 1c8fe9e1543..2cfbe324153 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -35299,6 +35299,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true); } + @Test + @TestMetadata("ambiguityWithUnsignedSpecificity.kt") + public void testAmbiguityWithUnsignedSpecificity() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/ambiguityWithUnsignedSpecificity.kt"); + } + @Test @TestMetadata("ArrayOfNothing.kt") public void testArrayOfNothing() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index af2510ca27b..be5e04edc4e 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -35395,6 +35395,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true); } + @Test + @TestMetadata("ambiguityWithUnsignedSpecificity.kt") + public void testAmbiguityWithUnsignedSpecificity() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/ambiguityWithUnsignedSpecificity.kt"); + } + @Test @TestMetadata("ArrayOfNothing.kt") public void testArrayOfNothing() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt index ea56fce0e31..9eabec9622d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt @@ -12,6 +12,8 @@ import org.jetbrains.kotlin.fir.resolve.FirSamResolver import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds.Byte import org.jetbrains.kotlin.name.StandardClassIds.Double import org.jetbrains.kotlin.name.StandardClassIds.Float @@ -79,6 +81,12 @@ abstract class AbstractConeCallConflictResolver( val specificClassId = specific.lowerBoundIfFlexible().classId ?: return false val generalClassId = general.upperBoundIfFlexible().classId ?: return false + // any signed >= any unsigned + + if (!specificClassId.isUnsigned && generalClassId.isUnsigned) { + return true + } + // int >= long, int >= short, short >= byte if (specificClassId == Int) { @@ -99,6 +107,8 @@ abstract class AbstractConeCallConflictResolver( return specificClassId == Double && generalClassId == Float } + + private val ClassId.isUnsigned get() = this in StandardClassIds.unsignedTypes } protected fun createFlatSignature(call: Candidate): FlatSignature { diff --git a/compiler/testData/diagnostics/testsWithStdLib/ambiguityWithUnsignedSpecificity.kt b/compiler/testData/diagnostics/testsWithStdLib/ambiguityWithUnsignedSpecificity.kt new file mode 100644 index 00000000000..b2a75e681c3 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/ambiguityWithUnsignedSpecificity.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// ISSUE: KT-57568 + +fun T.convert(): K = null!! + +fun of(size: ULong) { + of(size.convert()) +} + +fun of(size: Int) {} + +fun of(size: Long) {} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index dd90f1ee713..78c84c9bd8a 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -36143,6 +36143,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true); } + @Test + @TestMetadata("ambiguityWithUnsignedSpecificity.kt") + public void testAmbiguityWithUnsignedSpecificity() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/ambiguityWithUnsignedSpecificity.kt"); + } + @Test @TestMetadata("ArrayOfNothing.kt") public void testArrayOfNothing() throws Exception {