From bfb1a06f3dbf6d175b9a98a718877ebf91af4ccc Mon Sep 17 00:00:00 2001 From: pyos Date: Fri, 23 Apr 2021 12:32:44 +0200 Subject: [PATCH] FIR: resolve conflicts between overloads with platform integer types --- ...TouchedTilContractsPhaseTestGenerated.java | 5 ++++ .../arguments/integerOverloads.fir.txt | 21 ++++++++++++++++ .../resolve/arguments/integerOverloads.kt | 24 +++++++++++++++++++ .../runners/FirDiagnosticTestGenerated.java | 6 +++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 +++++ .../calls/AbstractConeCallConflictResolver.kt | 9 +++---- ...nosisCompilerFirTestdataTestGenerated.java | 5 ++++ 7 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.kt diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java index 6765142b8b7..0ad75f0f2c8 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java @@ -561,6 +561,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract runTest("compiler/fir/analysis-tests/testData/resolve/arguments/integerLiteralTypes.kt"); } + @TestMetadata("integerOverloads.kt") + public void testIntegerOverloads() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.kt"); + } + @TestMetadata("invoke.kt") public void testInvoke() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/arguments/invoke.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.fir.txt b/compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.fir.txt new file mode 100644 index 00000000000..c2a5ab53de4 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.fir.txt @@ -0,0 +1,21 @@ +FILE: x.kt + public final fun f(x: R|kotlin/Byte|): R|kotlin/Unit| { + } + public final fun f(x: R|kotlin/Int|): R|kotlin/Unit| { + } + public final fun f(x: R|kotlin/Long|): R|kotlin/Unit| { + } + public final fun g(x: R|kotlin/Byte?|): R|kotlin/Unit| { + } + public final fun g(x: R|kotlin/Int?|): R|kotlin/Unit| { + } + public final fun g(x: R|kotlin/Long?|): R|kotlin/Unit| { + } + public final fun main(): R|kotlin/Unit| { + Q|J|.R|/J.f|(Int(123)) + Q|J|.R|/J.f|(Long(123123123123)) + R|/f|(Int(123)) + R|/f|(Long(123123123123)) + R|/g|(Int(123)) + R|/g|(Long(123123123123)) + } diff --git a/compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.kt b/compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.kt new file mode 100644 index 00000000000..4492127eac3 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.kt @@ -0,0 +1,24 @@ +// FILE: J.java +public class J { + public static fun f(Byte x) {} + public static fun f(Integer x) {} + public static fun f(Long x) {} +} + +// FILE: x.kt +fun f(x: Byte) {} +fun f(x: Int) {} +fun f(x: Long) {} + +fun g(x: Byte?) {} +fun g(x: Int?) {} +fun g(x: Long?) {} + +fun main() { + J.f(123) + J.f(123123123123) + f(123) + f(123123123123) + g(123) + g(123123123123) +} diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index a7a8e223e9a..107745fde7b 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -659,6 +659,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolve/arguments/integerLiteralTypes.kt"); } + @Test + @TestMetadata("integerOverloads.kt") + public void testIntegerOverloads() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.kt"); + } + @Test @TestMetadata("invoke.kt") public void testInvoke() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 0e115e0b38b..dec721352ba 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -659,6 +659,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/arguments/integerLiteralTypes.kt"); } + @Test + @TestMetadata("integerOverloads.kt") + public void testIntegerOverloads() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.kt"); + } + @Test @TestMetadata("invoke.kt") public void testInvoke() 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 c997613edee..4458135d680 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 @@ -7,11 +7,8 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.StandardClassIds -import org.jetbrains.kotlin.fir.types.ConeKotlinType -import org.jetbrains.kotlin.fir.types.arrayElementType -import org.jetbrains.kotlin.fir.types.classId -import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.resolve.calls.results.* import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.requireOrDescribe @@ -69,8 +66,8 @@ abstract class AbstractConeCallConflictResolver( val uByte = StandardClassIds.UByte val uShort = StandardClassIds.UShort - val specificClassId = specific.classId ?: return false - val generalClassId = general.classId ?: return false + val specificClassId = specific.lowerBoundIfFlexible().classId ?: return false + val generalClassId = general.upperBoundIfFlexible().classId ?: return false // int >= long, int >= short, short >= byte diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index 80606da74b7..fd716c5911a 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -563,6 +563,11 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis runTest("compiler/fir/analysis-tests/testData/resolve/arguments/integerLiteralTypes.kt"); } + @TestMetadata("integerOverloads.kt") + public void testIntegerOverloads() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/arguments/integerOverloads.kt"); + } + @TestMetadata("invoke.kt") public void testInvoke() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/arguments/invoke.kt");