diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt index 59c4d6105f2..7e4dfce31b8 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt @@ -25,6 +25,9 @@ import org.jetbrains.kotlin.resolve.calls.inference.model.checkConstraint import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.intersectTypes +import org.jetbrains.kotlin.types.checker.isIntegerLiteralType +import org.jetbrains.kotlin.types.typeUtil.contains +import org.jetbrains.kotlin.utils.addToStdlib.safeAs class ResultTypeResolver( val typeApproximator: TypeApproximator, @@ -87,7 +90,8 @@ class ResultTypeResolver( private fun findSubType(c: Context, variableWithConstraints: VariableWithConstraints): UnwrappedType? { val lowerConstraints = variableWithConstraints.constraints.filter { it.kind == ConstraintKind.LOWER && c.isProperType(it.type) } if (lowerConstraints.isNotEmpty()) { - val commonSuperType = NewCommonSuperTypeCalculator.commonSuperType(lowerConstraints.map { it.type }) + val types = sinkIntegerLiteralTypes(lowerConstraints.map { it.type }) + val commonSuperType = NewCommonSuperTypeCalculator.commonSuperType(types) /** * * fun Array.intersect(other: Iterable) { @@ -115,6 +119,14 @@ class ResultTypeResolver( return null } + private fun sinkIntegerLiteralTypes(types: List): List { + return types.sortedBy { type -> + + val containsILT = type.contains { it.unwrap().safeAs()?.isIntegerLiteralType ?: false } + if (containsILT) 1 else 0 + } + } + private fun findSuperType(c: Context, variableWithConstraints: VariableWithConstraints): UnwrappedType? { val upperConstraints = variableWithConstraints.constraints.filter { it.kind == ConstraintKind.UPPER && c.isProperType(it.type) } if (upperConstraints.isNotEmpty()) { diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.kt b/compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.kt new file mode 100644 index 00000000000..784a9bba14a --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.kt @@ -0,0 +1,24 @@ +// !LANGUAGE: +NewInference +// !WITH_NEW_INFERENCE +// !DIAGNOSTICS: -USELESS_ELVIS -UNUSED_EXPRESSION + +class X { + fun toLong(): Long? = TODO() +} + +fun getLong(): Long = TODO() + +fun test_1(list: List) { + val props = list.map { it.toLong() ?: 0 } + ")!>props +} + +fun test_2(cond: Boolean) { + val props = if (cond) getLong() else 0 + props +} + +fun test_3(list: List) { + val props = list.map { Pair(it.toLong() ?: 0, it.toLong() ?: 0) } + >")!>props +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.txt b/compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.txt new file mode 100644 index 00000000000..71484ed922a --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.txt @@ -0,0 +1,14 @@ +package + +public fun getLong(): kotlin.Long +public fun test_1(/*0*/ list: kotlin.collections.List): kotlin.Unit +public fun test_2(/*0*/ cond: kotlin.Boolean): kotlin.Unit +public fun test_3(/*0*/ list: kotlin.collections.List): kotlin.Unit + +public final class X { + public constructor X() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun toLong(): kotlin.Long? + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index b0aec9cab1b..aea2c5c3236 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -2646,6 +2646,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/inference/arrayConstructor.kt"); } + @TestMetadata("integerLiterals.kt") + public void testIntegerLiterals() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.kt"); + } + @TestMetadata("kt11266.kt") public void testKt11266() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index cffce6e487c..90f48225fb8 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -2646,6 +2646,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/inference/arrayConstructor.kt"); } + @TestMetadata("integerLiterals.kt") + public void testIntegerLiterals() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.kt"); + } + @TestMetadata("kt11266.kt") public void testKt11266() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt");