diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 4e17429b1f4..1cae04acb40 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -342,7 +342,7 @@ public class CallResolver { ResolvedCallImpl copy = CallResolverUtil.copy((ResolvedCallImpl) resolvedCall, context); CallCandidateResolutionContext callCandidateResolutionContext = CallCandidateResolutionContext.createForCallBeingAnalyzed(copy, context, tracing); - candidateResolver.completeTypeInferenceDependentOnExpectedTypeForCall(callCandidateResolutionContext); + candidateResolver.completeTypeInferenceDependentOnExpectedTypeForCall(callCandidateResolutionContext, false); if (copy.getStatus().isSuccess()) { return OverloadResolutionResultsImpl.success(copy); 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 7e1e620bad8..eb71e0ecb4c 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 @@ -21,6 +21,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.intellij.openapi.progress.ProgressIndicatorProvider; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; @@ -42,6 +43,7 @@ import org.jetbrains.jet.lang.resolve.calls.tasks.TaskPrioritizer; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.jet.lang.types.*; +import org.jetbrains.jet.lang.types.expressions.DataFlowUtils; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -213,7 +215,8 @@ public class CandidateResolver { } public void completeTypeInferenceDependentOnExpectedTypeForCall( - CallCandidateResolutionContext context + @NotNull CallCandidateResolutionContext context, + boolean isInnerCall ) { ResolvedCallImpl resolvedCall = context.candidateCall; assert resolvedCall.hasUnknownTypeParameters(); @@ -264,6 +267,12 @@ public class CandidateResolver { if (status == ResolutionStatus.UNKNOWN_STATUS || status == ResolutionStatus.INCOMPLETE_TYPE_INFERENCE) { resolvedCall.setStatusToSuccess(); } + if (isInnerCall) { + PsiElement callElement = context.call.getCallElement(); + if (callElement instanceof JetCallExpression) { + DataFlowUtils.checkType(resolvedCall.getResultingDescriptor().getReturnType(), (JetCallExpression) callElement, context, context.dataFlowInfo); + } + } } public void completeValueArgumentsInference( @@ -291,7 +300,7 @@ public class CandidateResolver { CallCandidateResolutionContext contextForArgument = storedContextForArgument.replaceResolveMode(ResolveMode.NORMAL).replaceBindingTrace(context.trace).replaceExpectedType(expectedType); if (contextForArgument.candidateCall.hasUnknownTypeParameters()) { - completeTypeInferenceDependentOnExpectedTypeForCall(contextForArgument); + completeTypeInferenceDependentOnExpectedTypeForCall(contextForArgument, true); } else { completeValueArgumentsInference(contextForArgument);