From 267ce1d8920b6f2b6196864dbc19549a7cf7937a Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Fri, 4 Nov 2022 09:57:09 +0200 Subject: [PATCH] [FIR] KT-54220: Don't crash on unsigned integers when no stdlib present ^KT-54220 Fixed --- .../fir/diagnostics/KtFirDataClassConverters.kt | 6 ++++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 5 +++++ .../evaluate/FirCompileTimeConstantEvaluator.kt | 1 + ...DiagnosisCompilerFirTestdataTestGenerated.java | 12 ++++++++++++ ...sNotTouchedTilContractsPhaseTestGenerated.java | 5 +++++ .../testData/resolve/kt54220.fir.txt | 14 ++++++++++++++ .../analysis-tests/testData/resolve/kt54220.kt | 6 ++++++ .../testData/resolveWithStdlib/kt54220.fir.txt | 14 ++++++++++++++ .../testData/resolveWithStdlib/kt54220.kt | 6 ++++++ .../test/runners/FirDiagnosticTestGenerated.java | 12 ++++++++++++ .../FirDiagnosticsWithLightTreeTestGenerated.java | 12 ++++++++++++ .../generator/diagnostics/FirDiagnosticsList.kt | 1 + .../kotlin/fir/analysis/diagnostics/FirErrors.kt | 1 + .../diagnostics/FirErrorsDefaultMessages.kt | 5 +++++ .../diagnostics/coneDiagnosticToFirDiagnostic.kt | 1 + .../resolve/FirExpressionsResolveTransformer.kt | 15 ++++++++++++++- .../fir/diagnostics/ConeSimpleDiagnostic.kt | 1 + .../fir/types/ConeIntegerLiteralTypeImpl.kt | 6 ++++++ ...ignedLiteralsWithoutArtifactOnClasspath.fir.kt | 3 --- .../unsignedLiteralsWithoutArtifactOnClasspath.kt | 1 + ...ignedLiteralsWithoutArtifactOnClasspath.fir.kt | 3 --- .../unsignedLiteralsWithoutArtifactOnClasspath.kt | 1 + 23 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 compiler/fir/analysis-tests/testData/resolve/kt54220.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolve/kt54220.kt create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/kt54220.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/kt54220.kt delete mode 100644 compiler/testData/diagnostics/tests/inlineClasses/unsignedLiteralsWithoutArtifactOnClasspath.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/valueClasses/unsignedLiteralsWithoutArtifactOnClasspath.fir.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index d89a6555cfc..9410f18fe08 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -203,6 +203,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.UNSIGNED_LITERAL_WITHOUT_DECLARATIONS_ON_CLASSPATH) { firDiagnostic -> + UnsignedLiteralWithoutDeclarationsOnClasspathImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.DIVISION_BY_ZERO) { firDiagnostic -> DivisionByZeroImpl( firDiagnostic as KtPsiDiagnostic, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index de0746fd526..5ac50b2a35b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -179,6 +179,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = WrongLongSuffix::class } + abstract class UnsignedLiteralWithoutDeclarationsOnClasspath : KtFirDiagnostic() { + override val diagnosticClass get() = UnsignedLiteralWithoutDeclarationsOnClasspath::class + } + abstract class DivisionByZero : KtFirDiagnostic() { override val diagnosticClass get() = DivisionByZero::class } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index c02ece3bb4a..e4005cadb16 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -201,6 +201,11 @@ internal class WrongLongSuffixImpl( override val token: KtLifetimeToken, ) : KtFirDiagnostic.WrongLongSuffix(), KtAbstractFirDiagnostic +internal class UnsignedLiteralWithoutDeclarationsOnClasspathImpl( + override val firDiagnostic: KtPsiDiagnostic, + override val token: KtLifetimeToken, +) : KtFirDiagnostic.UnsignedLiteralWithoutDeclarationsOnClasspath(), KtAbstractFirDiagnostic + internal class DivisionByZeroImpl( override val firDiagnostic: KtPsiDiagnostic, override val token: KtLifetimeToken, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt index bd6f3f11f1e..97030886409 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt @@ -368,6 +368,7 @@ internal object FirCompileTimeConstantEvaluator { ConstantValueKind.UnsignedShort -> value.toLong().toUShort() ConstantValueKind.UnsignedInt -> value.toLong().toUInt() ConstantValueKind.UnsignedLong -> value.toLong().toULong() + ConstantValueKind.UnsignedIntegerLiteral -> value.toLong().toULong() else -> null } } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index 1d4de171892..20dd9d1e9f6 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -362,6 +362,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis runTest("compiler/fir/analysis-tests/testData/resolve/kt41990.kt"); } + @Test + @TestMetadata("kt54220.kt") + public void testKt54220() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/kt54220.kt"); + } + @Test @TestMetadata("labelAndReceiverForInfix.kt") public void testLabelAndReceiverForInfix() throws Exception { @@ -4664,6 +4670,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/kotlinComparatorAlias.kt"); } + @Test + @TestMetadata("kt54220.kt") + public void testKt54220() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/kt54220.kt"); + } + @Test @TestMetadata("listPlusAssign.kt") public void testListPlusAssign() throws Exception { 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 580c1ee79c3..85ea98bf5f1 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 @@ -309,6 +309,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract runTest("compiler/fir/analysis-tests/testData/resolve/kt41990.kt"); } + @TestMetadata("kt54220.kt") + public void testKt54220() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/kt54220.kt"); + } + @TestMetadata("labelAndReceiverForInfix.kt") public void testLabelAndReceiverForInfix() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/labelAndReceiverForInfix.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/kt54220.fir.txt b/compiler/fir/analysis-tests/testData/resolve/kt54220.fir.txt new file mode 100644 index 00000000000..6d9d442ddfd --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/kt54220.fir.txt @@ -0,0 +1,14 @@ +FILE: kt54220.kt + public final const val c: R|kotlin/String| = ERROR_EXPR(Unsigned integers need stdlib).R|kotlin/plus|(ERROR_EXPR(Unsigned integers need stdlib)) + public get(): R|kotlin/String| + public final fun box(): R|kotlin/String| { + ^box when () { + !=(R|/c|, ERROR_EXPR(Unsigned integers need stdlib)) -> { + String(fail) + } + else -> { + String(OK) + } + } + + } diff --git a/compiler/fir/analysis-tests/testData/resolve/kt54220.kt b/compiler/fir/analysis-tests/testData/resolve/kt54220.kt new file mode 100644 index 00000000000..e692a60782c --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/kt54220.kt @@ -0,0 +1,6 @@ +const val c = 1u + 2u + +fun box() = when { + c != 3u -> "fail" + else -> "OK" +} diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/kt54220.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/kt54220.fir.txt new file mode 100644 index 00000000000..daeead0a47f --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/kt54220.fir.txt @@ -0,0 +1,14 @@ +FILE: kt54220.kt + public final const val c: R|kotlin/UInt| = UInt(1).R|kotlin/UInt.plus|(UInt(2)) + public get(): R|kotlin/UInt| + public final fun box(): R|kotlin/String| { + ^box when () { + !=(R|/c|, UInt(3)) -> { + String(fail) + } + else -> { + String(OK) + } + } + + } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/kt54220.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/kt54220.kt new file mode 100644 index 00000000000..317646236be --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/kt54220.kt @@ -0,0 +1,6 @@ +const val c = 1u + 2u + +fun box() = when { + c != 3u -> "fail" + else -> "OK" +} 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 7fe0a4ce3de..e6aaa5a0f65 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 @@ -362,6 +362,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolve/kt41990.kt"); } + @Test + @TestMetadata("kt54220.kt") + public void testKt54220() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/kt54220.kt"); + } + @Test @TestMetadata("labelAndReceiverForInfix.kt") public void testLabelAndReceiverForInfix() throws Exception { @@ -4664,6 +4670,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/kotlinComparatorAlias.kt"); } + @Test + @TestMetadata("kt54220.kt") + public void testKt54220() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/kt54220.kt"); + } + @Test @TestMetadata("listPlusAssign.kt") public void testListPlusAssign() 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 9289aaa2a63..2529fc6f2da 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 @@ -362,6 +362,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/kt41990.kt"); } + @Test + @TestMetadata("kt54220.kt") + public void testKt54220() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/kt54220.kt"); + } + @Test @TestMetadata("labelAndReceiverForInfix.kt") public void testLabelAndReceiverForInfix() throws Exception { @@ -4664,6 +4670,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/kotlinComparatorAlias.kt"); } + @Test + @TestMetadata("kt54220.kt") + public void testKt54220() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/kt54220.kt"); + } + @Test @TestMetadata("listPlusAssign.kt") public void testListPlusAssign() throws Exception { diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 0337343ab9f..31936b23d38 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -76,6 +76,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val INT_LITERAL_OUT_OF_RANGE by error() val FLOAT_LITERAL_OUT_OF_RANGE by error() val WRONG_LONG_SUFFIX by error(PositioningStrategy.LONG_LITERAL_SUFFIX) + val UNSIGNED_LITERAL_WITHOUT_DECLARATIONS_ON_CLASSPATH by error() val DIVISION_BY_ZERO by warning() val VAL_OR_VAR_ON_LOOP_PARAMETER by error(PositioningStrategy.VAL_OR_VAR_NODE) { parameter("valOrVar") diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 1cf57d6f575..71ebe1f6bc1 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -133,6 +133,7 @@ object FirErrors { val INT_LITERAL_OUT_OF_RANGE by error0() val FLOAT_LITERAL_OUT_OF_RANGE by error0() val WRONG_LONG_SUFFIX by error0(SourceElementPositioningStrategies.LONG_LITERAL_SUFFIX) + val UNSIGNED_LITERAL_WITHOUT_DECLARATIONS_ON_CLASSPATH by error0() val DIVISION_BY_ZERO by warning0() val VAL_OR_VAR_ON_LOOP_PARAMETER by error1(SourceElementPositioningStrategies.VAL_OR_VAR_NODE) val VAL_OR_VAR_ON_FUN_PARAMETER by error1(SourceElementPositioningStrategies.VAL_OR_VAR_NODE) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 28f8426c24a..6e80e9fe35f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -532,6 +532,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSAFE_CALL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSAFE_IMPLICIT_INVOKE_CALL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSAFE_INFIX_CALL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSAFE_OPERATOR_CALL +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSIGNED_LITERAL_WITHOUT_DECLARATIONS_ON_CLASSPATH import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_FEATURE @@ -633,6 +634,10 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { map.put(WRONG_LONG_SUFFIX, "Use 'L' instead of 'l'") map.put(EMPTY_CHARACTER_LITERAL, "Empty character literal") map.put(FLOAT_LITERAL_OUT_OF_RANGE, "The value is out of range") + map.put( + UNSIGNED_LITERAL_WITHOUT_DECLARATIONS_ON_CLASSPATH, + "Type of the constant expression cannot be resolved. Please make sure you have the required dependencies for unsigned types in the classpath" + ) map.put(INCORRECT_CHARACTER_LITERAL, "Incorrect character literal") map.put(TOO_MANY_CHARACTERS_IN_CHARACTER_LITERAL, "Too many characters in a character literal") map.put(ILLEGAL_ESCAPE, "Illegal escape") diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index da14e4495cd..11978b2be5e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -499,6 +499,7 @@ private fun ConeSimpleDiagnostic.getFactory(source: KtSourceElement): KtDiagnost DiagnosticKind.IntLiteralOutOfRange -> FirErrors.INT_LITERAL_OUT_OF_RANGE DiagnosticKind.FloatLiteralOutOfRange -> FirErrors.FLOAT_LITERAL_OUT_OF_RANGE DiagnosticKind.WrongLongSuffix -> FirErrors.WRONG_LONG_SUFFIX + DiagnosticKind.UnsignedNumbersAreNotPresent -> FirErrors.UNSIGNED_LITERAL_WITHOUT_DECLARATIONS_ON_CLASSPATH DiagnosticKind.IncorrectCharacterLiteral -> FirErrors.INCORRECT_CHARACTER_LITERAL DiagnosticKind.EmptyCharacterLiteral -> FirErrors.EMPTY_CHARACTER_LITERAL DiagnosticKind.TooManyCharactersInCharacterLiteral -> FirErrors.TOO_MANY_CHARACTERS_IN_CHARACTER_LITERAL diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 9e612367d4d..b68b7e4da45 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -1010,11 +1010,15 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT ConstantValueKind.IntegerLiteral, ConstantValueKind.UnsignedIntegerLiteral -> { val expressionType = ConeIntegerLiteralConstantTypeImpl.create( constExpression.value as Long, + isTypePresent = { it.lookupTag.toSymbol(session) != null }, isUnsigned = kind == ConstantValueKind.UnsignedIntegerLiteral ) val expectedTypeRef = data.expectedType @Suppress("UNCHECKED_CAST") when { + expressionType is ConeErrorType -> { + expressionType + } expressionType is ConeClassLikeType -> { constExpression.replaceKind(expressionType.toConstKind() as ConstantValueKind) expressionType @@ -1040,7 +1044,16 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT dataFlowAnalyzer.exitConstExpression(constExpression as FirConstExpression<*>) constExpression.resultType = constExpression.resultType.resolvedTypeFromPrototype(type) - return constExpression + + return when (val resolvedType = constExpression.resultType.coneType) { + is ConeErrorType -> buildErrorExpression { + expression = constExpression + diagnostic = resolvedType.diagnostic + source = constExpression.source + } + + else -> constExpression + } } override fun transformAnnotation(annotation: FirAnnotation, data: ResolutionMode): FirStatement { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt index e048cc6566b..bfab7e8470e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt @@ -87,6 +87,7 @@ enum class DiagnosticKind { IntLiteralOutOfRange, FloatLiteralOutOfRange, WrongLongSuffix, + UnsignedNumbersAreNotPresent, IsEnumEntry, EnumEntryAsType, 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 69e2c8917e2..62030fd570e 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 @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.fir.types +import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic +import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.isLong import org.jetbrains.kotlin.fir.isULong import org.jetbrains.kotlin.name.StandardClassIds @@ -38,6 +40,7 @@ class ConeIntegerLiteralConstantTypeImpl( fun create( value: Long, isUnsigned: Boolean, + isTypePresent: (ConeClassLikeType) -> Boolean, nullability: ConeNullability = ConeNullability.NOT_NULL ): ConeSimpleKotlinType { val possibleTypes = mutableListOf() @@ -64,6 +67,9 @@ class ConeIntegerLiteralConstantTypeImpl( if (isUnsigned) { addUnsignedPossibleType() + if (possibleTypes.any { !isTypePresent(it) }) { + return ConeErrorType(ConeSimpleDiagnostic("Unsigned integers need stdlib", DiagnosticKind.UnsignedNumbersAreNotPresent)) + } } else { addSignedPossibleTypes() } diff --git a/compiler/testData/diagnostics/tests/inlineClasses/unsignedLiteralsWithoutArtifactOnClasspath.fir.kt b/compiler/testData/diagnostics/tests/inlineClasses/unsignedLiteralsWithoutArtifactOnClasspath.fir.kt deleted file mode 100644 index 7fa08d2d9a9..00000000000 --- a/compiler/testData/diagnostics/tests/inlineClasses/unsignedLiteralsWithoutArtifactOnClasspath.fir.kt +++ /dev/null @@ -1,3 +0,0 @@ -val u1 = 1u -val u2 = 0xFu -val u3 = 0b1u \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inlineClasses/unsignedLiteralsWithoutArtifactOnClasspath.kt b/compiler/testData/diagnostics/tests/inlineClasses/unsignedLiteralsWithoutArtifactOnClasspath.kt index 6cf80093333..b7b84610628 100644 --- a/compiler/testData/diagnostics/tests/inlineClasses/unsignedLiteralsWithoutArtifactOnClasspath.kt +++ b/compiler/testData/diagnostics/tests/inlineClasses/unsignedLiteralsWithoutArtifactOnClasspath.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL val u1 = 1u val u2 = 0xFu val u3 = 0b1u \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/valueClasses/unsignedLiteralsWithoutArtifactOnClasspath.fir.kt b/compiler/testData/diagnostics/tests/valueClasses/unsignedLiteralsWithoutArtifactOnClasspath.fir.kt deleted file mode 100644 index 7fa08d2d9a9..00000000000 --- a/compiler/testData/diagnostics/tests/valueClasses/unsignedLiteralsWithoutArtifactOnClasspath.fir.kt +++ /dev/null @@ -1,3 +0,0 @@ -val u1 = 1u -val u2 = 0xFu -val u3 = 0b1u \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/valueClasses/unsignedLiteralsWithoutArtifactOnClasspath.kt b/compiler/testData/diagnostics/tests/valueClasses/unsignedLiteralsWithoutArtifactOnClasspath.kt index 6cf80093333..b7b84610628 100644 --- a/compiler/testData/diagnostics/tests/valueClasses/unsignedLiteralsWithoutArtifactOnClasspath.kt +++ b/compiler/testData/diagnostics/tests/valueClasses/unsignedLiteralsWithoutArtifactOnClasspath.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL val u1 = 1u val u2 = 0xFu val u3 = 0b1u \ No newline at end of file