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 e808a104b71..4174f804622 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 @@ -198,8 +198,6 @@ public class CallResolver { JetSimpleNameExpression expression = (JetSimpleNameExpression) calleeExpression; functionReference = expression; - ExpressionTypingUtils.checkCapturingInClosure(expression, context.trace, context.scope); - Name name = expression.getReferencedNameAsName(); prioritizedTasks = TaskPrioritizer.computePrioritizedTasks(context, name, functionReference, CallableDescriptorCollectors.FUNCTIONS_AND_VARIABLES); @@ -306,8 +304,13 @@ public class CallResolver { } } - return doResolveCallOrGetCachedResults(ResolutionResultsCache.FUNCTION_MEMBER_TYPE, context, prioritizedTasks, - CallTransformer.FUNCTION_CALL_TRANSFORMER, functionReference); + OverloadResolutionResultsImpl results = doResolveCallOrGetCachedResults( + ResolutionResultsCache.FUNCTION_MEMBER_TYPE, context, prioritizedTasks, + CallTransformer.FUNCTION_CALL_TRANSFORMER, functionReference); + if (calleeExpression instanceof JetSimpleNameExpression) { + ExpressionTypingUtils.checkCapturingInClosure((JetSimpleNameExpression) calleeExpression, context.trace, context.scope); + } + return results; } public OverloadResolutionResults resolveCallWithKnownCandidate( diff --git a/compiler/testData/codegen/box/closures/captureOuterProperty/kt4656.kt b/compiler/testData/codegen/box/closures/captureOuterProperty/kt4656.kt new file mode 100644 index 00000000000..c3b93ff7efd --- /dev/null +++ b/compiler/testData/codegen/box/closures/captureOuterProperty/kt4656.kt @@ -0,0 +1,16 @@ +//KT-4656 Wrong capturing a function literal variable + +fun box(): String { + var foo = { 1 } + var bar = 1 + + val t = { "${foo()} $bar" } + fun b() = "${foo()} $bar" + + foo = { 2 } + bar = 2 + + if (t() != "2 2") return "fail1" + if (b() != "2 2") return "fail2" + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index b9aaf383df8..10dc59db4ba 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -1566,6 +1566,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/closures/captureOuterProperty/kt4176.kt"); } + @TestMetadata("kt4656.kt") + public void testKt4656() throws Exception { + doTest("compiler/testData/codegen/box/closures/captureOuterProperty/kt4656.kt"); + } + } @TestMetadata("compiler/testData/codegen/box/closures/closureInsideClosure")