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 9b8ff218387..2becc94c213 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 @@ -6453,6 +6453,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/floatsAndDoubles.kt"); } + @Test + @TestMetadata("identityCompare.kt") + public void testIdentityCompare() throws Exception { + runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/identityCompare.kt"); + } + @Test @TestMetadata("integer.kt") public void testInteger() throws Exception { @@ -6530,6 +6536,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia public void testUnaryMinusIndependentExpType() throws Exception { runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/unaryMinusIndependentExpType.kt"); } + + @Test + @TestMetadata("unsignedOperations.kt") + public void testUnsignedOperations() throws Exception { + runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/unsignedOperations.kt"); + } } @Nested 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 1e03b6b5dd3..9123d734579 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 @@ -6453,6 +6453,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/floatsAndDoubles.kt"); } + @Test + @TestMetadata("identityCompare.kt") + public void testIdentityCompare() throws Exception { + runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/identityCompare.kt"); + } + @Test @TestMetadata("integer.kt") public void testInteger() throws Exception { @@ -6530,6 +6536,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated public void testUnaryMinusIndependentExpType() throws Exception { runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/unaryMinusIndependentExpType.kt"); } + + @Test + @TestMetadata("unsignedOperations.kt") + public void testUnsignedOperations() throws Exception { + runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/unsignedOperations.kt"); + } } @Nested 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 b554e3f6e72..21998535d79 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 @@ -6447,6 +6447,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/floatsAndDoubles.kt"); } + @Test + @TestMetadata("identityCompare.kt") + public void testIdentityCompare() throws Exception { + runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/identityCompare.kt"); + } + @Test @TestMetadata("integer.kt") public void testInteger() throws Exception { @@ -6524,6 +6530,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir public void testUnaryMinusIndependentExpType() throws Exception { runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/unaryMinusIndependentExpType.kt"); } + + @Test + @TestMetadata("unsignedOperations.kt") + public void testUnsignedOperations() throws Exception { + runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/unsignedOperations.kt"); + } } @Nested 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 e78a9250865..8c2fe296812 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 @@ -6453,6 +6453,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/floatsAndDoubles.kt"); } + @Test + @TestMetadata("identityCompare.kt") + public void testIdentityCompare() throws Exception { + runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/identityCompare.kt"); + } + @Test @TestMetadata("integer.kt") public void testInteger() throws Exception { @@ -6530,6 +6536,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia public void testUnaryMinusIndependentExpType() throws Exception { runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/unaryMinusIndependentExpType.kt"); } + + @Test + @TestMetadata("unsignedOperations.kt") + public void testUnsignedOperations() throws Exception { + runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/unsignedOperations.kt"); + } } @Nested diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt index a19ab2f2ae5..511c4dc3709 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt @@ -80,7 +80,7 @@ internal fun checkConstantArguments( expression is FirComparisonExpression -> { return checkConstantArguments(expression.compareToCall, session) } - expression is FirStringConcatenationCall || expression is FirEqualityOperatorCall -> { + expression is FirStringConcatenationCall -> { for (exp in (expression as FirCall).arguments) { if (exp is FirResolvedQualifier || expression.isForbiddenComplexConstant(session)) { return ConstantArgumentKind.NOT_CONST @@ -88,6 +88,17 @@ internal fun checkConstantArguments( checkConstantArguments(exp, session)?.let { return it } } } + expression is FirEqualityOperatorCall -> { + if (expression.operation == FirOperation.IDENTITY || expression.operation == FirOperation.NOT_IDENTITY) { + return ConstantArgumentKind.NOT_CONST + } + for (exp in (expression as FirCall).arguments) { + if (exp is FirResolvedQualifier || expression.isForbiddenComplexConstant(session) || exp.resolvedType.isUnsignedType) { + return ConstantArgumentKind.NOT_CONST + } + checkConstantArguments(exp, session)?.let { return it } + } + } expression is FirGetClassCall -> { var coneType = (expression as? FirCall)?.argument?.resolvedType diff --git a/compiler/testData/diagnostics/tests/constantEvaluator/constant/identityCompare.fir.kt b/compiler/testData/diagnostics/tests/constantEvaluator/constant/identityCompare.fir.kt new file mode 100644 index 00000000000..093a9287e36 --- /dev/null +++ b/compiler/testData/diagnostics/tests/constantEvaluator/constant/identityCompare.fir.kt @@ -0,0 +1,29 @@ +// WITH_STDLIB +const val int = 456 +const val uint = 456U + +const val equal1 = 1 === 2 +const val equal2 = int === 2 +const val equal3 = 1 === int +const val equal4 = 1u === int + +const val equal5 = 1u === 2u +const val equal6 = uint === 2u +const val equal7 = 1 === uint +const val equal8 = 1u === uint + +const val equal9 = uint === int +const val equal10 = int === uint + +const val notEqual1 = 1 !== 2 +const val notEqual2 = int !== 2 +const val notEqual3 = 1 !== int +const val notEqual4 = 1u !== int + +const val notEqual5 = 1u !== 2u +const val notEqual6 = uint !== 2u +const val notEqual7 = 1 !== uint +const val notEqual8 = 1u !== uint + +const val notEqual9 = uint !== int +const val notEqual10 = int !== uint diff --git a/compiler/testData/diagnostics/tests/constantEvaluator/constant/identityCompare.kt b/compiler/testData/diagnostics/tests/constantEvaluator/constant/identityCompare.kt new file mode 100644 index 00000000000..10c8eb4d384 --- /dev/null +++ b/compiler/testData/diagnostics/tests/constantEvaluator/constant/identityCompare.kt @@ -0,0 +1,29 @@ +// WITH_STDLIB +const val int = 456 +const val uint = 456U + +const val equal1 = 1 === 2 +const val equal2 = int === 2 +const val equal3 = 1 === int +const val equal4 = 1u === int + +const val equal5 = 1u === 2u +const val equal6 = uint === 2u +const val equal7 = 1 === uint +const val equal8 = 1u === uint + +const val equal9 = uint === int +const val equal10 = int === uint + +const val notEqual1 = 1 !== 2 +const val notEqual2 = int !== 2 +const val notEqual3 = 1 !== int +const val notEqual4 = 1u !== int + +const val notEqual5 = 1u !== 2u +const val notEqual6 = uint !== 2u +const val notEqual7 = 1 !== uint +const val notEqual8 = 1u !== uint + +const val notEqual9 = uint !== int +const val notEqual10 = int !== uint diff --git a/compiler/testData/diagnostics/tests/constantEvaluator/constant/unsignedOperations.kt b/compiler/testData/diagnostics/tests/constantEvaluator/constant/unsignedOperations.kt new file mode 100644 index 00000000000..9a19da73252 --- /dev/null +++ b/compiler/testData/diagnostics/tests/constantEvaluator/constant/unsignedOperations.kt @@ -0,0 +1,55 @@ +// FIR_IDENTICAL +// WITH_STDLIB +const val uint = 456U + +const val plus = 1u + 2u +const val minus = 2u - 1u +const val mul = 1u * 2u +const val div = 1u / 2u + +const val rem = 1u % 2u +const val floorDiv = 1u.floorDiv(2u) +const val mod = 1u.mod(2u) + +const val increment = 1u.inc() +const val decrement = 1u.dec() + +const val shl = 1u.shl(1) +const val shr = 1u.shr(1) + +const val and = 1u.and(2u) +const val or = 1u.or(2u) +const val xor = 1u.xor(2u) +const val inv = 1u.inv() + +const val toByte = 1u.toByte() +const val toShort = 1u.toShort() +const val toInt = 1u.toInt() +const val toLong = 1u.toLong() +const val toFloat = 1u.toFloat() +const val toDouble = 1u.toDouble() + +const val toUByte = 1u.toUByte() +const val toUShort = 1u.toUShort() +const val toUInt = 1u.toUInt() +const val toULong = 1u.toULong() + +const val toString = 1u.toString() + +const val stringPlus1 = 1u.toString() + 2 +const val stringPlus2 = "${1u} 2" +const val stringPlus3 = "1" + 2u +const val stringPlus4 = "1" + 2u.toString() + +const val compare1 = 1u < 2u +const val compare2 = 1u <= 2u +const val compare3 = 1u > 2u +const val compare4 = 1u >= 2u + +const val equal1 = 1u == 1u +const val equal2 = uint == 1u +const val equal3 = 1u == uint + +const val notEqual1 = 1u != 1u +const val notEqual2 = uint != 1u +const val notEqual3 = 1u != uint diff --git a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/jsCode/compileTimeStringWithIntrinConstCall.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/jsCode/compileTimeStringWithIntrinConstCall.fir.kt index 2394946646f..f64df4e42b0 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/jsCode/compileTimeStringWithIntrinConstCall.fir.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/jsCode/compileTimeStringWithIntrinConstCall.fir.kt @@ -87,25 +87,25 @@ fun testLogicOperations() { fun testEq() { js("{ var a = ${1 == 1}; }") js("{ var a = ${1U == 1U}; }") - js("{ var a = ${UONE == 1U}; }") + js("{ var a = ${UONE == 1U}; }") js("{ var a = ${"FOO" == STR}; }") js("{ var a = ${TRUE == null}; }") js("{ var a = ${STR == null}; }") js("{ var a = ${1 != 1}; }") js("{ var a = ${1U != 1U}; }") - js("{ var a = ${UONE != 1U}; }") + js("{ var a = ${UONE != 1U}; }") js("{ var a = ${"FOO" != STR}; }") js("{ var a = ${TRUE != null}; }") js("{ var a = ${STR != null}; }") js("{ var a = ${1 === 1}; }") - js("{ var a = ${TRUE === false}; }") - js("{ var a = ${CHAR === 's'}; }") + js("{ var a = ${TRUE === false}; }") + js("{ var a = ${CHAR === 's'}; }") js("{ var a = ${1 !== 1}; }") - js("{ var a = ${TRUE !== false}; }") - js("{ var a = ${CHAR !== 's'}; }") + js("{ var a = ${TRUE !== false}; }") + js("{ var a = ${CHAR !== 's'}; }") } fun testCmp() { 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 3c69c53b3b9..7eac41540ad 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 @@ -6453,6 +6453,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/floatsAndDoubles.kt"); } + @Test + @TestMetadata("identityCompare.kt") + public void testIdentityCompare() throws Exception { + runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/identityCompare.kt"); + } + @Test @TestMetadata("integer.kt") public void testInteger() throws Exception { @@ -6530,6 +6536,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { public void testUnaryMinusIndependentExpType() throws Exception { runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/unaryMinusIndependentExpType.kt"); } + + @Test + @TestMetadata("unsignedOperations.kt") + public void testUnsignedOperations() throws Exception { + runTest("compiler/testData/diagnostics/tests/constantEvaluator/constant/unsignedOperations.kt"); + } } @Nested