[NI] Fix 'only input type' check for intersection types

Check worked incorrectly in case when argument type and expected type are the
same intersection type, which is possible for local variables without explicit
type declaration.
This commit is contained in:
Pavel Kirpichenkov
2019-11-20 15:22:25 +03:00
parent 57760e5873
commit afd59f0d46
5 changed files with 28 additions and 5 deletions
@@ -275,11 +275,9 @@ class NewConstraintSystemImpl(
if (variableWithConstraints == null || variableWithConstraints.typeVariable.safeAs<NewTypeVariable>()?.hasOnlyInputTypesAnnotation() != true ) return
val projectedInputCallTypes = variableWithConstraints.projectedInputCallTypes
val resultTypeIsInputType = projectedInputCallTypes.any { inputType ->
val constructor = inputType.constructor
if (constructor is IntersectionTypeConstructor)
constructor.supertypes.any { NewKotlinTypeChecker.Default.equalTypes(resultType, it) }
else
NewKotlinTypeChecker.Default.equalTypes(resultType, inputType)
NewKotlinTypeChecker.Default.equalTypes(resultType, inputType) ||
inputType.constructor is IntersectionTypeConstructor
&& inputType.constructor.supertypes.any { NewKotlinTypeChecker.Default.equalTypes(resultType, it) }
}
if (!resultTypeIsInputType) {
addError(OnlyInputTypesDiagnostic(variableWithConstraints.typeVariable as NewTypeVariable))
@@ -0,0 +1,12 @@
// !LANGUAGE: +NewInference
import kotlin.test.assertEquals
fun test() {
val u = when (true) {
true -> 42
else -> 1.0
}
assertEquals(42, u)
}
@@ -0,0 +1,3 @@
package
public fun test(): kotlin.Unit
@@ -2716,6 +2716,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.kt");
}
@TestMetadata("intersectionInputType.kt")
public void testIntersectionInputType() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/intersectionInputType.kt");
}
@TestMetadata("kt11266.kt")
public void testKt11266() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt");
@@ -2716,6 +2716,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.kt");
}
@TestMetadata("intersectionInputType.kt")
public void testIntersectionInputType() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/intersectionInputType.kt");
}
@TestMetadata("kt11266.kt")
public void testKt11266() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt");