diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 394f56a0c0a..6a0cae2e595 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -3365,7 +3365,8 @@ public class ExpressionCodegen extends KtVisitor impleme KotlinType receiverExpressionType = expressionJetType(expression.getReceiverExpression()); Type receiverAsmType = receiverExpressionType != null ? asmType(receiverExpressionType) : null; - StackValue receiverValue = receiverExpressionType != null ? gen(expression.getReceiverExpression()) : null; + StackValue receiverValue = + receiverExpressionType != null ? StackValue.coercion(gen(expression.getReceiverExpression()), receiverAsmType) : null; FunctionDescriptor functionDescriptor = bindingContext.get(FUNCTION, expression); if (functionDescriptor != null) { diff --git a/compiler/testData/codegen/box/callableReference/bound/genericValOnLHS.kt b/compiler/testData/codegen/box/callableReference/bound/genericValOnLHS.kt new file mode 100644 index 00000000000..8911473c689 --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/bound/genericValOnLHS.kt @@ -0,0 +1,12 @@ +class Generic

(val p: P) + +class Host { + fun t() {} + val v = "OK" +} + +fun box(): String { + Generic(Host()).p::class + (Generic(Host()).p::t)() + return (Generic(Host()).p::v)() +} diff --git a/compiler/testData/codegen/box/callableReference/bound/smartCastForExtensionReceiver.kt b/compiler/testData/codegen/box/callableReference/bound/smartCastForExtensionReceiver.kt new file mode 100644 index 00000000000..c48830488c4 --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/bound/smartCastForExtensionReceiver.kt @@ -0,0 +1,15 @@ +class B + +fun B.magic() { +} + +fun boom(a: Any) { + when (a) { + is B -> run(a::magic) + } +} + +fun box(): String { + boom(B()) + return "OK" +} diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 2394a7f318b..bdc08706d99 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -1573,6 +1573,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("genericValOnLHS.kt") + public void testGenericValOnLHS() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/genericValOnLHS.kt"); + doTest(fileName); + } + @TestMetadata("kCallableNameIntrinsic.kt") public void testKCallableNameIntrinsic() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/kCallableNameIntrinsic.kt"); @@ -1627,6 +1633,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("smartCastForExtensionReceiver.kt") + public void testSmartCastForExtensionReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/smartCastForExtensionReceiver.kt"); + doTest(fileName); + } + @TestMetadata("syntheticExtensionOnLHS.kt") public void testSyntheticExtensionOnLHS() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/syntheticExtensionOnLHS.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 62c84d5705b..b9a15a57185 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -1573,6 +1573,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("genericValOnLHS.kt") + public void testGenericValOnLHS() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/genericValOnLHS.kt"); + doTest(fileName); + } + @TestMetadata("kCallableNameIntrinsic.kt") public void testKCallableNameIntrinsic() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/kCallableNameIntrinsic.kt"); @@ -1627,6 +1633,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("smartCastForExtensionReceiver.kt") + public void testSmartCastForExtensionReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/smartCastForExtensionReceiver.kt"); + doTest(fileName); + } + @TestMetadata("syntheticExtensionOnLHS.kt") public void testSyntheticExtensionOnLHS() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/syntheticExtensionOnLHS.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 778edfeeacf..46ebcd40ece 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -1573,6 +1573,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("genericValOnLHS.kt") + public void testGenericValOnLHS() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/genericValOnLHS.kt"); + doTest(fileName); + } + @TestMetadata("kCallableNameIntrinsic.kt") public void testKCallableNameIntrinsic() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/kCallableNameIntrinsic.kt"); @@ -1627,6 +1633,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("smartCastForExtensionReceiver.kt") + public void testSmartCastForExtensionReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/smartCastForExtensionReceiver.kt"); + doTest(fileName); + } + @TestMetadata("syntheticExtensionOnLHS.kt") public void testSyntheticExtensionOnLHS() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/syntheticExtensionOnLHS.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 b5f8c3c4e3c..6132640642f 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 @@ -1892,6 +1892,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); } + @TestMetadata("genericValOnLHS.kt") + public void testGenericValOnLHS() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/genericValOnLHS.kt"); + doTest(fileName); + } + @TestMetadata("kCallableNameIntrinsic.kt") public void testKCallableNameIntrinsic() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/kCallableNameIntrinsic.kt"); @@ -1946,6 +1952,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("smartCastForExtensionReceiver.kt") + public void testSmartCastForExtensionReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/bound/smartCastForExtensionReceiver.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/codegen/box/callableReference/bound/equals") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)