[FE 1.0] Fix false positive INTEGER_OPERATOR_RESOLVE_WILL_CHANGE
^KT-47729 In progress
This commit is contained in:
committed by
TeamCityServer
parent
2fb5f776d8
commit
afb7625d0c
+6
@@ -19877,6 +19877,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
|||||||
runTest("compiler/testData/diagnostics/tests/numbers/kt47447.kt");
|
runTest("compiler/testData/diagnostics/tests/numbers/kt47447.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt47729.kt")
|
||||||
|
public void testKt47729() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/numbers/kt47729.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt47729_parenthesis.kt")
|
@TestMetadata("kt47729_parenthesis.kt")
|
||||||
public void testKt47729_parenthesis() throws Exception {
|
public void testKt47729_parenthesis() throws Exception {
|
||||||
|
|||||||
+6
@@ -19877,6 +19877,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
|||||||
runTest("compiler/testData/diagnostics/tests/numbers/kt47447.kt");
|
runTest("compiler/testData/diagnostics/tests/numbers/kt47447.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt47729.kt")
|
||||||
|
public void testKt47729() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/numbers/kt47729.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt47729_parenthesis.kt")
|
@TestMetadata("kt47729_parenthesis.kt")
|
||||||
public void testKt47729_parenthesis() throws Exception {
|
public void testKt47729_parenthesis() throws Exception {
|
||||||
|
|||||||
+6
-1
@@ -23,6 +23,8 @@ import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor
|
|||||||
import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstant
|
import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstant
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||||
import org.jetbrains.kotlin.types.lowerIfFlexible
|
import org.jetbrains.kotlin.types.lowerIfFlexible
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isPrimitiveNumberOrNullableType
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
||||||
|
|
||||||
object NewSchemeOfIntegerOperatorResolutionChecker : CallChecker {
|
object NewSchemeOfIntegerOperatorResolutionChecker : CallChecker {
|
||||||
override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {
|
override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {
|
||||||
@@ -34,6 +36,9 @@ object NewSchemeOfIntegerOperatorResolutionChecker : CallChecker {
|
|||||||
} else {
|
} else {
|
||||||
valueParameter.type
|
valueParameter.type
|
||||||
}.unwrap().lowerIfFlexible()
|
}.unwrap().lowerIfFlexible()
|
||||||
|
if (!expectedType.isPrimitiveNumberOrNullableType()) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
for (argument in arguments.arguments) {
|
for (argument in arguments.arguments) {
|
||||||
val expression = KtPsiUtil.deparenthesize(argument.getArgumentExpression()) ?: continue
|
val expression = KtPsiUtil.deparenthesize(argument.getArgumentExpression()) ?: continue
|
||||||
val compileTimeValue =
|
val compileTimeValue =
|
||||||
@@ -50,7 +55,7 @@ object NewSchemeOfIntegerOperatorResolutionChecker : CallChecker {
|
|||||||
|
|
||||||
val valueTypeConstructor = compileTimeValue.unknownIntegerType.constructor as? IntegerLiteralTypeConstructor ?: continue
|
val valueTypeConstructor = compileTimeValue.unknownIntegerType.constructor as? IntegerLiteralTypeConstructor ?: continue
|
||||||
val approximatedType = valueTypeConstructor.getApproximatedType()
|
val approximatedType = valueTypeConstructor.getApproximatedType()
|
||||||
if (approximatedType != expectedType) {
|
if (approximatedType.constructor != expectedType.constructor) {
|
||||||
context.trace.report(Errors.INTEGER_OPERATOR_RESOLVE_WILL_CHANGE.on(expression, approximatedType))
|
context.trace.report(Errors.INTEGER_OPERATOR_RESOLVE_WILL_CHANGE.on(expression, approximatedType))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -11,8 +11,8 @@ annotation class Ann(
|
|||||||
@Ann(
|
@Ann(
|
||||||
p1 = <!INTEGER_OVERFLOW!>java.lang.Integer.MAX_VALUE + 1<!>,
|
p1 = <!INTEGER_OVERFLOW!>java.lang.Integer.MAX_VALUE + 1<!>,
|
||||||
p2 = 1 + 1,
|
p2 = 1 + 1,
|
||||||
p3 = <!INTEGER_OVERFLOW, TYPE_MISMATCH!>java.lang.Integer.MAX_VALUE + 1<!>,
|
p3 = <!INTEGER_OPERATOR_RESOLVE_WILL_CHANGE, INTEGER_OVERFLOW, TYPE_MISMATCH!>java.lang.Integer.MAX_VALUE + 1<!>,
|
||||||
p4 = <!TYPE_MISMATCH!>1.toInt() + 1.toInt()<!>,
|
p4 = <!INTEGER_OPERATOR_RESOLVE_WILL_CHANGE, TYPE_MISMATCH!>1.toInt() + 1.toInt()<!>,
|
||||||
p5 = 1.toInt() + 1.toInt()
|
p5 = 1.toInt() + 1.toInt()
|
||||||
) class MyClass
|
) class MyClass
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
// LANGUAGE: -ApproximateIntegerLiteralTypesInReceiverPosition
|
||||||
|
// ISSUE: Kt-47447, KT-47729
|
||||||
|
|
||||||
|
fun takeLong(value : Long) {}
|
||||||
|
fun takeInt(value : Int) {}
|
||||||
|
fun takeAny(value : Any) {}
|
||||||
|
fun takeLongX(value : Long?) {}
|
||||||
|
fun takeIntX(value : Int?) {}
|
||||||
|
fun takeAnyX(value : Any?) {}
|
||||||
|
fun <A> takeGeneric(value : A) {}
|
||||||
|
fun <A> takeGenericX(value : A?) {}
|
||||||
|
|
||||||
|
fun test_1() {
|
||||||
|
takeLong(<!ARGUMENT_TYPE_MISMATCH!>1 + 1<!>) // warning
|
||||||
|
takeInt(1 + 1) // ok
|
||||||
|
takeAny(1 + 1) // ok
|
||||||
|
takeLongX(<!ARGUMENT_TYPE_MISMATCH!>1 + 1<!>) // warning
|
||||||
|
takeIntX(1 + 1) // ok
|
||||||
|
takeAnyX(1 + 1) // ok
|
||||||
|
takeGeneric(1 + 1) // ok
|
||||||
|
takeGenericX(1 + 1) // ok
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
// LANGUAGE: -ApproximateIntegerLiteralTypesInReceiverPosition
|
||||||
|
// ISSUE: Kt-47447, KT-47729
|
||||||
|
|
||||||
|
fun takeLong(value : Long) {}
|
||||||
|
fun takeInt(value : Int) {}
|
||||||
|
fun takeAny(value : Any) {}
|
||||||
|
fun takeLongX(value : Long?) {}
|
||||||
|
fun takeIntX(value : Int?) {}
|
||||||
|
fun takeAnyX(value : Any?) {}
|
||||||
|
fun <A> takeGeneric(value : A) {}
|
||||||
|
fun <A> takeGenericX(value : A?) {}
|
||||||
|
|
||||||
|
fun test_1() {
|
||||||
|
takeLong(<!INTEGER_OPERATOR_RESOLVE_WILL_CHANGE!>1 + 1<!>) // warning
|
||||||
|
takeInt(1 + 1) // ok
|
||||||
|
takeAny(1 + 1) // ok
|
||||||
|
takeLongX(<!INTEGER_OPERATOR_RESOLVE_WILL_CHANGE!>1 + 1<!>) // warning
|
||||||
|
takeIntX(1 + 1) // ok
|
||||||
|
takeAnyX(1 + 1) // ok
|
||||||
|
takeGeneric(1 + 1) // ok
|
||||||
|
takeGenericX(1 + 1) // ok
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun takeAny(/*0*/ value: kotlin.Any): kotlin.Unit
|
||||||
|
public fun takeAnyX(/*0*/ value: kotlin.Any?): kotlin.Unit
|
||||||
|
public fun </*0*/ A> takeGeneric(/*0*/ value: A): kotlin.Unit
|
||||||
|
public fun </*0*/ A> takeGenericX(/*0*/ value: A?): kotlin.Unit
|
||||||
|
public fun takeInt(/*0*/ value: kotlin.Int): kotlin.Unit
|
||||||
|
public fun takeIntX(/*0*/ value: kotlin.Int?): kotlin.Unit
|
||||||
|
public fun takeLong(/*0*/ value: kotlin.Long): kotlin.Unit
|
||||||
|
public fun takeLongX(/*0*/ value: kotlin.Long?): kotlin.Unit
|
||||||
|
public fun test_1(): kotlin.Unit
|
||||||
+1
-1
@@ -33,7 +33,7 @@ fun test() {
|
|||||||
takeUInt(<!INTEGER_OVERFLOW, TYPE_MISMATCH!>Int.MAX_VALUE * 2<!>)
|
takeUInt(<!INTEGER_OVERFLOW, TYPE_MISMATCH!>Int.MAX_VALUE * 2<!>)
|
||||||
takeUInt(<!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>4294967294<!>)
|
takeUInt(<!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>4294967294<!>)
|
||||||
|
|
||||||
takeUBytes(<!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>1<!>, <!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>2<!>, <!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>255<!>, <!CONSTANT_EXPECTED_TYPE_MISMATCH, SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>256<!>, <!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>0<!>, <!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED, TYPE_MISMATCH!>-1<!>, <!INTEGER_OPERATOR_RESOLVE_WILL_CHANGE, SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>40 + 2<!>)
|
takeUBytes(<!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>1<!>, <!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>2<!>, <!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>255<!>, <!CONSTANT_EXPECTED_TYPE_MISMATCH, SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>256<!>, <!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>0<!>, <!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED, TYPE_MISMATCH!>-1<!>, <!SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED!>40 + 2<!>)
|
||||||
|
|
||||||
takeUInt(<!TYPE_MISMATCH!>1.myPlus(2)<!>)
|
takeUInt(<!TYPE_MISMATCH!>1.myPlus(2)<!>)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ fun test() {
|
|||||||
js((b))
|
js((b))
|
||||||
js(("c"))
|
js(("c"))
|
||||||
js(<!CONSTANT_EXPECTED_TYPE_MISMATCH, JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>3<!>)
|
js(<!CONSTANT_EXPECTED_TYPE_MISMATCH, JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>3<!>)
|
||||||
js(<!INTEGER_OPERATOR_RESOLVE_WILL_CHANGE, JSCODE_ARGUMENT_SHOULD_BE_CONSTANT, TYPE_MISMATCH!>3 + 2<!>)
|
js(<!JSCODE_ARGUMENT_SHOULD_BE_CONSTANT, TYPE_MISMATCH!>3 + 2<!>)
|
||||||
js(<!CONSTANT_EXPECTED_TYPE_MISMATCH, JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>1.0f<!>)
|
js(<!CONSTANT_EXPECTED_TYPE_MISMATCH, JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>1.0f<!>)
|
||||||
js(<!CONSTANT_EXPECTED_TYPE_MISMATCH, JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>true<!>)
|
js(<!CONSTANT_EXPECTED_TYPE_MISMATCH, JSCODE_ARGUMENT_SHOULD_BE_CONSTANT!>true<!>)
|
||||||
js("$a")
|
js("$a")
|
||||||
|
|||||||
Generated
+6
@@ -19883,6 +19883,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/numbers/kt47447.kt");
|
runTest("compiler/testData/diagnostics/tests/numbers/kt47447.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt47729.kt")
|
||||||
|
public void testKt47729() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/numbers/kt47729.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt47729_parenthesis.kt")
|
@TestMetadata("kt47729_parenthesis.kt")
|
||||||
public void testKt47729_parenthesis() throws Exception {
|
public void testKt47729_parenthesis() throws Exception {
|
||||||
|
|||||||
+6
@@ -19877,6 +19877,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
|
|||||||
runTest("compiler/testData/diagnostics/tests/numbers/kt47447.kt");
|
runTest("compiler/testData/diagnostics/tests/numbers/kt47447.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt47729.kt")
|
||||||
|
public void testKt47729() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/numbers/kt47729.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt47729_parenthesis.kt")
|
@TestMetadata("kt47729_parenthesis.kt")
|
||||||
public void testKt47729_parenthesis() throws Exception {
|
public void testKt47729_parenthesis() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user