Fix diagnostic inferred type calculation for null in some cases
#KT-36222 fixed
This commit is contained in:
Generated
+5
@@ -18079,6 +18079,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte
|
|||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt35668.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt35668.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt36222.kt")
|
||||||
|
public void testKt36222() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/regressions/kt36222.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt3647.kt")
|
@TestMetadata("kt3647.kt")
|
||||||
public void testKt3647() throws Exception {
|
public void testKt3647() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt3647.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt3647.kt");
|
||||||
|
|||||||
+6
-1
@@ -33,6 +33,8 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
|||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.expressions.ControlStructureTypingUtils
|
import org.jetbrains.kotlin.types.expressions.ControlStructureTypingUtils
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isNullableNothing
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.makeNullable
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.cast
|
import org.jetbrains.kotlin.utils.addToStdlib.cast
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
|
|
||||||
@@ -333,12 +335,15 @@ class DiagnosticReporterByTrackingStrategy(
|
|||||||
|
|
||||||
(position as? ExpectedTypeConstraintPosition)?.let {
|
(position as? ExpectedTypeConstraintPosition)?.let {
|
||||||
val call = it.topLevelCall.psiKotlinCall.psiCall.callElement.safeAs<KtExpression>()
|
val call = it.topLevelCall.psiKotlinCall.psiCall.callElement.safeAs<KtExpression>()
|
||||||
|
val inferredType =
|
||||||
|
if (!constraintError.lowerKotlinType.isNullableNothing()) constraintError.lowerKotlinType
|
||||||
|
else constraintError.upperKotlinType.makeNullable()
|
||||||
reportIfNonNull(call) {
|
reportIfNonNull(call) {
|
||||||
trace.report(
|
trace.report(
|
||||||
Errors.TYPE_MISMATCH.on(
|
Errors.TYPE_MISMATCH.on(
|
||||||
it,
|
it,
|
||||||
constraintError.upperKotlinType,
|
constraintError.upperKotlinType,
|
||||||
constraintError.lowerKotlinType
|
inferredType
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// !LANGUAGE: +NewInference
|
||||||
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
fun foo(f: () -> String) {}
|
||||||
|
fun <K> select(x: K, y: K): K = x
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
foo { select("non-null", null) } // inferred String? but String is expected
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// !LANGUAGE: +NewInference
|
||||||
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
fun foo(f: () -> String) {}
|
||||||
|
fun <K> select(x: K, y: K): K = x
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
foo { <!TYPE_MISMATCH!>select("non-null", null)<!> } // inferred String? but String is expected
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun foo(/*0*/ f: () -> kotlin.String): kotlin.Unit
|
||||||
|
public fun </*0*/ K> select(/*0*/ x: K, /*1*/ y: K): K
|
||||||
|
public fun test(): kotlin.Unit
|
||||||
@@ -18091,6 +18091,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali
|
|||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt35668.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt35668.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt36222.kt")
|
||||||
|
public void testKt36222() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/regressions/kt36222.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt3647.kt")
|
@TestMetadata("kt3647.kt")
|
||||||
public void testKt3647() throws Exception {
|
public void testKt3647() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt3647.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt3647.kt");
|
||||||
|
|||||||
Generated
+5
@@ -18081,6 +18081,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
|||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt35668.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt35668.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt36222.kt")
|
||||||
|
public void testKt36222() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/regressions/kt36222.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt3647.kt")
|
@TestMetadata("kt3647.kt")
|
||||||
public void testKt3647() throws Exception {
|
public void testKt3647() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt3647.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt3647.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user