[FIR] Forbid to use equality and unsigned comparison in const expression

#KT-62683
This commit is contained in:
Ivan Kylchik
2023-10-27 18:47:33 +02:00
committed by Space Team
parent 8715bd6189
commit fd4a3a0b88
10 changed files with 191 additions and 7 deletions
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,29 @@
// WITH_STDLIB
const val int = 456
const val uint = 456U
const val equal1 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>1 === 2<!>
const val equal2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>int === 2<!>
const val equal3 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>1 === int<!>
const val equal4 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1u === int<!>
const val equal5 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1u === 2u<!>
const val equal6 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>uint === 2u<!>
const val equal7 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1 === uint<!>
const val equal8 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1u === uint<!>
const val equal9 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>uint === int<!>
const val equal10 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>int === uint<!>
const val notEqual1 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>1 !== 2<!>
const val notEqual2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>int !== 2<!>
const val notEqual3 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>1 !== int<!>
const val notEqual4 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1u !== int<!>
const val notEqual5 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1u !== 2u<!>
const val notEqual6 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>uint !== 2u<!>
const val notEqual7 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1 !== uint<!>
const val notEqual8 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1u !== uint<!>
const val notEqual9 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>uint !== int<!>
const val notEqual10 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>int !== uint<!>
@@ -0,0 +1,29 @@
// WITH_STDLIB
const val int = 456
const val uint = 456U
const val equal1 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>1 === 2<!>
const val equal2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>int === 2<!>
const val equal3 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>1 === int<!>
const val equal4 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, EQUALITY_NOT_APPLICABLE, FORBIDDEN_IDENTITY_EQUALS!>1u === int<!>
const val equal5 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1u === 2u<!>
const val equal6 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>uint === 2u<!>
const val equal7 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, EQUALITY_NOT_APPLICABLE, FORBIDDEN_IDENTITY_EQUALS!>1 === uint<!>
const val equal8 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1u === uint<!>
const val equal9 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, EQUALITY_NOT_APPLICABLE, FORBIDDEN_IDENTITY_EQUALS!>uint === int<!>
const val equal10 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, EQUALITY_NOT_APPLICABLE, FORBIDDEN_IDENTITY_EQUALS!>int === uint<!>
const val notEqual1 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>1 !== 2<!>
const val notEqual2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>int !== 2<!>
const val notEqual3 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, DEPRECATED_IDENTITY_EQUALS!>1 !== int<!>
const val notEqual4 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, EQUALITY_NOT_APPLICABLE, FORBIDDEN_IDENTITY_EQUALS!>1u !== int<!>
const val notEqual5 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1u !== 2u<!>
const val notEqual6 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>uint !== 2u<!>
const val notEqual7 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, EQUALITY_NOT_APPLICABLE, FORBIDDEN_IDENTITY_EQUALS!>1 !== uint<!>
const val notEqual8 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, FORBIDDEN_IDENTITY_EQUALS!>1u !== uint<!>
const val notEqual9 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, EQUALITY_NOT_APPLICABLE, FORBIDDEN_IDENTITY_EQUALS!>uint !== int<!>
const val notEqual10 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER, EQUALITY_NOT_APPLICABLE, FORBIDDEN_IDENTITY_EQUALS!>int !== uint<!>
@@ -0,0 +1,55 @@
// FIR_IDENTICAL
// WITH_STDLIB
const val uint = 456U
const val plus = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u + 2u<!>
const val minus = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>2u - 1u<!>
const val mul = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u * 2u<!>
const val div = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u / 2u<!>
const val rem = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u % 2u<!>
const val floorDiv = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.floorDiv(2u)<!>
const val mod = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.mod(2u)<!>
const val increment = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.inc()<!>
const val decrement = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.dec()<!>
const val shl = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.shl(1)<!>
const val shr = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.shr(1)<!>
const val and = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.and(2u)<!>
const val or = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.or(2u)<!>
const val xor = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.xor(2u)<!>
const val inv = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.inv()<!>
const val toByte = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toByte()<!>
const val toShort = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toShort()<!>
const val toInt = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toInt()<!>
const val toLong = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toLong()<!>
const val toFloat = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toFloat()<!>
const val toDouble = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toDouble()<!>
const val toUByte = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toUByte()<!>
const val toUShort = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toUShort()<!>
const val toUInt = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toUInt()<!>
const val toULong = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toULong()<!>
const val toString = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toString()<!>
const val stringPlus1 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u.toString() + 2<!>
const val stringPlus2 = "${1u} 2"
const val stringPlus3 = "1" + 2u
const val stringPlus4 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>"1" + 2u.toString()<!>
const val compare1 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u < 2u<!>
const val compare2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u <= 2u<!>
const val compare3 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u > 2u<!>
const val compare4 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u >= 2u<!>
const val equal1 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u == 1u<!>
const val equal2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>uint == 1u<!>
const val equal3 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u == uint<!>
const val notEqual1 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u != 1u<!>
const val notEqual2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>uint != 1u<!>
const val notEqual3 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1u != uint<!>
@@ -87,25 +87,25 @@ fun testLogicOperations() {
fun testEq() {
js("{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1 == 1<!>}; }")
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1U == 1U<!>}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${UONE == 1U}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>UONE == 1U<!>}; }"<!>)
js("{ var a = ${"FOO" == STR}; }")
js("{ var a = ${TRUE == null}; }")
js("{ var a = ${STR == null}; }")
js("{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1 != 1<!>}; }")
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1U != 1U<!>}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${UONE != 1U}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>UONE != 1U<!>}; }"<!>)
js("{ var a = ${"FOO" != STR}; }")
js("{ var a = ${TRUE != null}; }")
js("{ var a = ${STR != null}; }")
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1 === 1<!>}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${TRUE === false}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${CHAR === 's'}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>TRUE === false<!>}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>CHAR === 's'<!>}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>1 !== 1<!>}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${TRUE !== false}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${CHAR !== 's'}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>TRUE !== false<!>}; }"<!>)
js(<!JSCODE_CAN_NOT_VERIFY_JAVASCRIPT!>"{ var a = ${<!JSCODE_ARGUMENT_NON_CONST_EXPRESSION!>CHAR !== 's'<!>}; }"<!>)
}
fun testCmp() {
@@ -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