diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index 093221eec2d..f0e48412e03 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -276,8 +276,11 @@ public class CandidateResolver { ReceiverValue receiverArgument = candidateCall.getReceiverArgument(); ReceiverParameterDescriptor receiverParameter = candidateWithFreshVariables.getReceiverParameter(); if (receiverArgument.exists() && receiverParameter != null) { - constraintsSystem.addSubtypeConstraint(receiverParameter.getType(), receiverArgument.getType(), - ConstraintPosition.RECEIVER_POSITION); + JetType receiverType = + context.candidateCall.isSafeCall() + ? TypeUtils.makeNotNullable(receiverArgument.getType()) + : receiverArgument.getType(); + constraintsSystem.addSubtypeConstraint(receiverParameter.getType(), receiverType, ConstraintPosition.RECEIVER_POSITION); } ConstraintSystem diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt3174.kt b/compiler/testData/diagnostics/tests/inference/regressions/kt3174.kt new file mode 100644 index 00000000000..48bb892a997 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt3174.kt @@ -0,0 +1,12 @@ +//KT-3174 Call resolver doesn't understand type is not-nullable after ?. safe call +package a + +fun T.test(): T = this +fun foo(a: Any?) = a?.test() // Error + +fun T.fff(l: MutableList) = l.add(this) + +fun test(s: String?, l: MutableList) { + s?.fff(l) + +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index f8053d332e1..20b063a78f9 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -2247,6 +2247,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/inference/regressions/kt3150.kt"); } + @TestMetadata("kt3174.kt") + public void testKt3174() throws Exception { + doTest("compiler/testData/diagnostics/tests/inference/regressions/kt3174.kt"); + } + @TestMetadata("kt702.kt") public void testKt702() throws Exception { doTest("compiler/testData/diagnostics/tests/inference/regressions/kt702.kt");