[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 if (variableWithConstraints == null || variableWithConstraints.typeVariable.safeAs<NewTypeVariable>()?.hasOnlyInputTypesAnnotation() != true ) return
val projectedInputCallTypes = variableWithConstraints.projectedInputCallTypes val projectedInputCallTypes = variableWithConstraints.projectedInputCallTypes
val resultTypeIsInputType = projectedInputCallTypes.any { inputType -> val resultTypeIsInputType = projectedInputCallTypes.any { inputType ->
val constructor = inputType.constructor NewKotlinTypeChecker.Default.equalTypes(resultType, inputType) ||
if (constructor is IntersectionTypeConstructor) inputType.constructor is IntersectionTypeConstructor
constructor.supertypes.any { NewKotlinTypeChecker.Default.equalTypes(resultType, it) } && inputType.constructor.supertypes.any { NewKotlinTypeChecker.Default.equalTypes(resultType, it) }
else
NewKotlinTypeChecker.Default.equalTypes(resultType, inputType)
} }
if (!resultTypeIsInputType) { if (!resultTypeIsInputType) {
addError(OnlyInputTypesDiagnostic(variableWithConstraints.typeVariable as NewTypeVariable)) 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"); 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") @TestMetadata("kt11266.kt")
public void testKt11266() throws Exception { public void testKt11266() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt"); 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"); 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") @TestMetadata("kt11266.kt")
public void testKt11266() throws Exception { public void testKt11266() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt");