diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt index d104284d0ee..4827e3e4d9a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt @@ -461,7 +461,11 @@ class DiagnosticReporterByTrackingStrategy( is TypeVariableForLambdaReturnType -> "return type of lambda" else -> error("Unsupported type variable: $typeVariable") } - trace.reportDiagnosticOnce(NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER.on(expression, typeVariableName)) + val unwrappedExpression = if (expression is KtBlockExpression) { + expression.statements.lastOrNull() ?: expression + } else expression + + trace.reportDiagnosticOnce(NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER.on(unwrappedExpression, typeVariableName)) } } diff --git a/compiler/testData/diagnostics/tests/inference/reportNotEnoughTypeInformationErrorsOnBlockExpressions.fir.kt b/compiler/testData/diagnostics/tests/inference/reportNotEnoughTypeInformationErrorsOnBlockExpressions.fir.kt new file mode 100644 index 00000000000..f097ddd470b --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/reportNotEnoughTypeInformationErrorsOnBlockExpressions.fir.kt @@ -0,0 +1,29 @@ +// WITH_RUNTIME +// SKIP_TXT +// !DIAGNOSTICS: -CAST_NEVER_SUCCEEDS + +import kotlin.experimental.ExperimentalTypeInference + +class Foo7 + +fun foo7() = null as Foo7 + +fun poll17(flag: Boolean): Any? { + val inv = if (flag) { foo7() } else { ::Foo7 } + return inv +} + +fun poll26(flag: Boolean): Any? { + val inv = when (flag) { true -> ::Foo7 false -> foo7() else -> ::Foo7 } + return inv +} + +fun poll36(flag: Boolean): Any? { + val inv = when (flag) { true -> ::Foo7 false -> foo7() } + return inv +} + +fun poll56(): Any? { + val inv = try { ::Foo7 } catch (e: Exception) { foo7() } finally { foo7() } + return inv +} diff --git a/compiler/testData/diagnostics/tests/inference/reportNotEnoughTypeInformationErrorsOnBlockExpressions.kt b/compiler/testData/diagnostics/tests/inference/reportNotEnoughTypeInformationErrorsOnBlockExpressions.kt new file mode 100644 index 00000000000..d98af6dcace --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/reportNotEnoughTypeInformationErrorsOnBlockExpressions.kt @@ -0,0 +1,29 @@ +// WITH_RUNTIME +// SKIP_TXT +// !DIAGNOSTICS: -CAST_NEVER_SUCCEEDS + +import kotlin.experimental.ExperimentalTypeInference + +class Foo7 + +fun foo7() = null as Foo7 + +fun poll17(flag: Boolean): Any? { + val inv = if (flag) { foo7() } else { ::Foo7 } + return inv +} + +fun poll26(flag: Boolean): Any? { + val inv = when (flag) { true -> ::Foo7 false -> foo7() else -> ::Foo7 } + return inv +} + +fun poll36(flag: Boolean): Any? { + val inv = when (flag) { true -> ::Foo7 false -> foo7() } + return inv +} + +fun poll56(): Any? { + val inv = try { ::Foo7 } catch (e: Exception) { foo7() } finally { foo7() } + return inv +}