diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 4f3716e24a4..acb5e4ff9e9 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -686,6 +686,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/SafeCallOnSuperReceiver.kt"); } + @Test + @TestMetadata("SafeCallUnknownType.kt") + public void testSafeCallUnknownType() throws Exception { + runTest("compiler/testData/diagnostics/tests/SafeCallUnknownType.kt"); + } + @Test @TestMetadata("Serializable.kt") public void testSerializable() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt index 978448f76f1..8f56e44e99e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt @@ -67,6 +67,7 @@ import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices import org.jetbrains.kotlin.types.expressions.KotlinTypeInfo import org.jetbrains.kotlin.types.expressions.typeInfoFactory.createTypeInfo import org.jetbrains.kotlin.types.expressions.typeInfoFactory.noTypeInfo +import org.jetbrains.kotlin.types.isError import org.jetbrains.kotlin.types.refinement.TypeRefinement import javax.inject.Inject @@ -534,15 +535,17 @@ class CallExpressionResolver( } ?: false fun reportUnnecessarySafeCall( - trace: BindingTrace, type: KotlinType, - callOperationNode: ASTNode, explicitReceiver: Receiver? - ) = trace.report( + trace: BindingTrace, + type: KotlinType, + callOperationNode: ASTNode, + explicitReceiver: Receiver? + ) { if (explicitReceiver is ExpressionReceiver && explicitReceiver.expression is KtSuperExpression) { - UNEXPECTED_SAFE_CALL.on(callOperationNode.psi) - } else { - UNNECESSARY_SAFE_CALL.on(callOperationNode.psi, type) + trace.report(UNEXPECTED_SAFE_CALL.on(callOperationNode.psi)) + } else if (!type.isError) { + trace.report(UNNECESSARY_SAFE_CALL.on(callOperationNode.psi, type)) } - ) + } private fun checkNestedClassAccess( expression: KtQualifiedExpression, diff --git a/compiler/testData/diagnostics/tests/SafeCallUnknownType.fir.kt b/compiler/testData/diagnostics/tests/SafeCallUnknownType.fir.kt new file mode 100644 index 00000000000..b341e164a90 --- /dev/null +++ b/compiler/testData/diagnostics/tests/SafeCallUnknownType.fir.kt @@ -0,0 +1,7 @@ +// !WITH_NEW_INFERENCE +import com.unknown + +fun ff() { + val a = unknown() + val b = a?.plus(42) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/SafeCallUnknownType.kt b/compiler/testData/diagnostics/tests/SafeCallUnknownType.kt new file mode 100644 index 00000000000..5bec3fc2fb1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/SafeCallUnknownType.kt @@ -0,0 +1,7 @@ +// !WITH_NEW_INFERENCE +import com.unknown + +fun ff() { + val a = unknown() + val b = a?.plus(42) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/SafeCallUnknownType.txt b/compiler/testData/diagnostics/tests/SafeCallUnknownType.txt new file mode 100644 index 00000000000..99c7d67ddd4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/SafeCallUnknownType.txt @@ -0,0 +1,3 @@ +package + +public fun ff(): kotlin.Unit diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 9944b7b6e2c..4f3213e34ff 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -686,6 +686,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/SafeCallOnSuperReceiver.kt"); } + @Test + @TestMetadata("SafeCallUnknownType.kt") + public void testSafeCallUnknownType() throws Exception { + runTest("compiler/testData/diagnostics/tests/SafeCallUnknownType.kt"); + } + @Test @TestMetadata("Serializable.kt") public void testSerializable() throws Exception {