From 2057deb91b359c1af5a20e5eb0e0d8396f110df1 Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Sat, 9 Jul 2022 11:44:23 +0200 Subject: [PATCH] [FE 1.0] Create DONT_CARE type only for callable references with no expected type Otherwise, it can be resolved safety ^KT-52270 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++ .../expressions/ExpressionTypingServices.java | 2 +- .../codegen/box/callableReference/kt52270.kt | 61 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++ .../LightAnalysisModeTestGenerated.java | 5 ++ .../js/test/JsCodegenBoxTestGenerated.java | 6 ++ .../test/ir/IrJsCodegenBoxTestGenerated.java | 6 ++ .../IrCodegenBoxWasmTestGenerated.java | 5 ++ .../NativeCodegenBoxTestGenerated.java | 6 ++ 10 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/callableReference/kt52270.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index f80e4304126..ad9638c99aa 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -3147,6 +3147,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/callableReference/kt51844.kt"); } + @Test + @TestMetadata("kt52270.kt") + public void testKt52270() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt52270.kt"); + } + @Test @TestMetadata("nested.kt") public void testNested() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java index d04bde07a08..a1165fa2919 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java @@ -382,7 +382,7 @@ public class ExpressionTypingServices { ) ); - if (!isUnitExpectedType && statementExpression instanceof KtCallableReferenceExpression) { + if (context.expectedType == NO_EXPECTED_TYPE && statementExpression instanceof KtCallableReferenceExpression) { KotlinTypeInfo typeInfo = createDontCareTypeInfoForNILambda(statementExpression, context); if (typeInfo != null) return typeInfo; } diff --git a/compiler/testData/codegen/box/callableReference/kt52270.kt b/compiler/testData/codegen/box/callableReference/kt52270.kt new file mode 100644 index 00000000000..5d4a664ceac --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/kt52270.kt @@ -0,0 +1,61 @@ +// WITH_STDLIB + +import kotlin.random.Random + +fun fun1() { +} + +fun fun2() { +} + +fun takesLambda(lambda: () -> Unit) { + lambda() +} + +fun takesOtherLambda(lambda: () -> Unit) = lambda() + +fun foo() {} + +fun bar2(): Int = 1 +fun foo4(): K = 2 as K + +fun test1(): String { + takesOtherLambda { + val reference: () -> Unit = if (Random.nextBoolean()) { + ::fun1 + } else { + ::fun2 + } + takesLambda(reference) + } + return "OK" +} + +fun test2(): String { + takesOtherLambda { + val reference: () -> Unit = if (Random.nextBoolean()) + ::fun1 + else + ::fun2 + takesLambda(reference) + } + return "OK" +} + +fun test3(): String { + takesOtherLambda { + val reference: () -> Unit = if (Random.nextBoolean()) { + foo() + ::fun1 + } else { + foo() + ::fun2 + } + takesLambda(reference) + } + return "OK" +} + +fun box(): String { + return if (test1() == "OK" && test2() == "OK" && test3() == "OK") "OK" else "NOK" +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 014ef4491ea..81910298a35 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -3051,6 +3051,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/callableReference/kt51844.kt"); } + @Test + @TestMetadata("kt52270.kt") + public void testKt52270() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt52270.kt"); + } + @Test @TestMetadata("nested.kt") public void testNested() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 1fe681136c6..c000ec4e10c 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -3147,6 +3147,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/callableReference/kt51844.kt"); } + @Test + @TestMetadata("kt52270.kt") + public void testKt52270() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt52270.kt"); + } + @Test @TestMetadata("nested.kt") public void testNested() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 9672de2b92f..c2a434b0e61 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -2673,6 +2673,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/callableReference/kt51844.kt"); } + @TestMetadata("kt52270.kt") + public void testKt52270() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt52270.kt"); + } + @TestMetadata("nested.kt") public void testNested() throws Exception { runTest("compiler/testData/codegen/box/callableReference/nested.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index 963dd49ee90..65b68e8821d 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -1989,6 +1989,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/callableReference/kt51844.kt"); } + @Test + @TestMetadata("kt52270.kt") + public void testKt52270() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt52270.kt"); + } + @Test @TestMetadata("nested.kt") public void testNested() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index 465b7603890..82fc239524f 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -2031,6 +2031,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/callableReference/kt51844.kt"); } + @Test + @TestMetadata("kt52270.kt") + public void testKt52270() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt52270.kt"); + } + @Test @TestMetadata("nested.kt") public void testNested() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 3d9bb07775a..5161090cb79 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -1813,6 +1813,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/callableReference/kt51844.kt"); } + @TestMetadata("kt52270.kt") + public void testKt52270() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt52270.kt"); + } + @TestMetadata("nested.kt") public void testNested() throws Exception { runTest("compiler/testData/codegen/box/callableReference/nested.kt"); diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index 3c86f9fbabe..bd86415a3e0 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -2083,6 +2083,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest runTest("compiler/testData/codegen/box/callableReference/kt51844.kt"); } + @Test + @TestMetadata("kt52270.kt") + public void testKt52270() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt52270.kt"); + } + @Test @TestMetadata("nested.kt") public void testNested() throws Exception {