From a299cec2eb4060622bfc0ea9ffd5e22bfbd86cc9 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 26 Dec 2012 16:43:59 +0400 Subject: [PATCH] KT-3174 Call resolver doesn't understand type is not-nullable after ?. safe call #KT-3174 fixed --- .../jet/lang/resolve/calls/CandidateResolver.java | 7 +++++-- .../tests/inference/regressions/kt3174.kt | 12 ++++++++++++ .../jet/checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inference/regressions/kt3174.kt 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");