From fd12f247253cbe873b66c8c680444a8564377634 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Tue, 2 Jan 2024 14:36:54 +0100 Subject: [PATCH] [FIR] Only let supertypes of ILTs include Number when it's not unsigned #KT-64607 Fixed --- ...cCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...osticCompilerFE10TestDataTestGenerated.java | 6 ++++++ ...reeOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...PsiOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../fir/types/ConeIntegerLiteralTypeImpl.kt | 14 +++++++++++--- .../unsignedTypes/numberReceiverNotValid.kt | 18 ++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 7 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/unsignedTypes/numberReceiverNotValid.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 9c4bae2f923..6f9636c3267 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 @@ -39266,6 +39266,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.kt"); } + @Test + @TestMetadata("numberReceiverNotValid.kt") + public void testNumberReceiverNotValid() throws Exception { + runTest("compiler/testData/diagnostics/tests/unsignedTypes/numberReceiverNotValid.kt"); + } + @Test @TestMetadata("overloadResolutionOfBasicOperations.kt") public void testOverloadResolutionOfBasicOperations() 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 15b9a5aee33..bf7384b7717 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 @@ -39266,6 +39266,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.kt"); } + @Test + @TestMetadata("numberReceiverNotValid.kt") + public void testNumberReceiverNotValid() throws Exception { + runTest("compiler/testData/diagnostics/tests/unsignedTypes/numberReceiverNotValid.kt"); + } + @Test @TestMetadata("overloadResolutionOfBasicOperations.kt") public void testOverloadResolutionOfBasicOperations() 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 e2fb139351f..7a2ef1e71e0 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 @@ -36992,6 +36992,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.kt"); } + @Test + @TestMetadata("numberReceiverNotValid.kt") + public void testNumberReceiverNotValid() throws Exception { + runTest("compiler/testData/diagnostics/tests/unsignedTypes/numberReceiverNotValid.kt"); + } + @Test @TestMetadata("overloadResolutionOfBasicOperations.kt") public void testOverloadResolutionOfBasicOperations() 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 b7340c2972f..005db78df65 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 @@ -37112,6 +37112,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.kt"); } + @Test + @TestMetadata("numberReceiverNotValid.kt") + public void testNumberReceiverNotValid() throws Exception { + runTest("compiler/testData/diagnostics/tests/unsignedTypes/numberReceiverNotValid.kt"); + } + @Test @TestMetadata("overloadResolutionOfBasicOperations.kt") public void testOverloadResolutionOfBasicOperations() throws Exception { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/ConeIntegerLiteralTypeImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/ConeIntegerLiteralTypeImpl.kt index 904bb746241..f71b99e4099 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/ConeIntegerLiteralTypeImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/ConeIntegerLiteralTypeImpl.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.model.SimpleTypeMarker +import org.jetbrains.kotlin.utils.addToStdlib.runIf class ConeIntegerLiteralConstantTypeImpl( value: Long, @@ -139,10 +140,17 @@ fun ConeKotlinType.approximateIntegerLiteralType(expectedType: ConeKotlinType? = private object ConeIntegerLiteralTypeExtensions { fun createSupertypeList(type: ConeIntegerLiteralType): List { - return listOf( - createClassLikeType(StandardClassIds.Number), + val comparableSuperType = ConeClassLikeTypeImpl(StandardClassIds.Comparable.toLookupTag(), arrayOf(ConeKotlinTypeProjectionIn(type)), false) - ) + + return if (type.possibleTypes.none { it.isUnsignedTypeOrNullableUnsignedType }) { + listOf( + createClassLikeType(StandardClassIds.Number), + comparableSuperType, + ) + } else { + listOf(comparableSuperType) + } } fun createClassLikeType(classId: ClassId): ConeClassLikeType { diff --git a/compiler/testData/diagnostics/tests/unsignedTypes/numberReceiverNotValid.kt b/compiler/testData/diagnostics/tests/unsignedTypes/numberReceiverNotValid.kt new file mode 100644 index 00000000000..8c4cb0d1708 --- /dev/null +++ b/compiler/testData/diagnostics/tests/unsignedTypes/numberReceiverNotValid.kt @@ -0,0 +1,18 @@ +// FIR_IDENTICAL +// WITH_STDLIB +// LANGUAGE: +ContextReceivers +// ISSUE: KT-64607 + +val Number.a get() = "" +fun Number.b() = "" +context(Number) val c get() = "" +context(Number) fun d() = "" + +fun test() { + 2U.a + 2U.b() + with (2U) { + c + d() + } +} 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 6bbaa83bc3d..0d559b40533 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 @@ -39266,6 +39266,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.kt"); } + @Test + @TestMetadata("numberReceiverNotValid.kt") + public void testNumberReceiverNotValid() throws Exception { + runTest("compiler/testData/diagnostics/tests/unsignedTypes/numberReceiverNotValid.kt"); + } + @Test @TestMetadata("overloadResolutionOfBasicOperations.kt") public void testOverloadResolutionOfBasicOperations() throws Exception {