Fix unresolved reference to catch parameter from lambda expression
#KT-41140 Fixed
diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java
index 17c157c..3e31ab9 100644
--- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java
+++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java
@@ -12642,6 +12642,11 @@
runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt");
}
+ @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt")
+ public void testReferenceToCatchParameterFromLambdaExpression() throws Exception {
+ runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt");
+ }
+
@TestMetadata("unsafeVarianceCodegen.kt")
public void testUnsafeVarianceCodegen() throws Exception {
runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt
index ba0b230..6da2881 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt
@@ -728,6 +728,9 @@
val argumentName = valueArgument.getArgumentName()?.asName
+ @Suppress("NAME_SHADOWING")
+ val outerCallContext = outerCallContext.expandContextForCatchClause(ktExpression)
+
processFunctionalExpression(
outerCallContext, argumentExpression, startDataFlowInfo,
valueArgument, argumentName, builtIns, typeResolver
@@ -743,7 +746,7 @@
val context = outerCallContext.replaceContextDependency(ContextDependency.DEPENDENT)
.replaceDataFlowInfo(startDataFlowInfo)
- .expandContextForCatchClause(ktExpression).let {
+ .let {
if (isSpecialFunction &&
argumentExpression is KtBlockExpression &&
ArgumentTypeResolver.getCallableReferenceExpressionIfAny(argumentExpression, it) != null
diff --git a/compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt b/compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt
new file mode 100644
index 0000000..88c088c
--- /dev/null
+++ b/compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt
@@ -0,0 +1,12 @@
+fun test(): () -> Throwable {
+ return try {
+ TODO()
+ } catch (e: Throwable) {
+ { -> e }
+ }
+}
+
+fun box(): String {
+ val exception = test()()
+ return if (exception is NotImplementedError) "OK" else "fail: $exception"
+}
\ No newline at end of file
diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java
index a9cc763..88f94b0 100644
--- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java
+++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java
@@ -13867,6 +13867,11 @@
runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt");
}
+ @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt")
+ public void testReferenceToCatchParameterFromLambdaExpression() throws Exception {
+ runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt");
+ }
+
@TestMetadata("unsafeVarianceCodegen.kt")
public void testUnsafeVarianceCodegen() throws Exception {
runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java
index 29dc419..a57b54a 100644
--- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java
+++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java
@@ -13867,6 +13867,11 @@
runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt");
}
+ @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt")
+ public void testReferenceToCatchParameterFromLambdaExpression() throws Exception {
+ runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt");
+ }
+
@TestMetadata("unsafeVarianceCodegen.kt")
public void testUnsafeVarianceCodegen() throws Exception {
runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java
index c89a2f6..f34e0b6 100644
--- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java
+++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java
@@ -12642,6 +12642,11 @@
runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt");
}
+ @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt")
+ public void testReferenceToCatchParameterFromLambdaExpression() throws Exception {
+ runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt");
+ }
+
@TestMetadata("unsafeVarianceCodegen.kt")
public void testUnsafeVarianceCodegen() throws Exception {
runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java
index 6e5c063..88637d7 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java
+++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java
@@ -10817,6 +10817,11 @@
runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt");
}
+ @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt")
+ public void testReferenceToCatchParameterFromLambdaExpression() throws Exception {
+ runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt");
+ }
+
@TestMetadata("unsafeVarianceCodegen.kt")
public void testUnsafeVarianceCodegen() throws Exception {
runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java
index b3e0690..f550c94 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java
+++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java
@@ -10817,6 +10817,11 @@
runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt");
}
+ @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt")
+ public void testReferenceToCatchParameterFromLambdaExpression() throws Exception {
+ runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt");
+ }
+
@TestMetadata("unsafeVarianceCodegen.kt")
public void testUnsafeVarianceCodegen() throws Exception {
runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java
index 13161fa..19fffc4 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java
+++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java
@@ -10882,6 +10882,11 @@
runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt");
}
+ @TestMetadata("referenceToCatchParameterFromLambdaExpression.kt")
+ public void testReferenceToCatchParameterFromLambdaExpression() throws Exception {
+ runTest("compiler/testData/codegen/box/inference/referenceToCatchParameterFromLambdaExpression.kt");
+ }
+
@TestMetadata("unsafeVarianceCodegen.kt")
public void testUnsafeVarianceCodegen() throws Exception {
runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");