From 24f3c7dc7d26dcb5c17dd6e25273dca9d660edb1 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 21 Apr 2022 23:25:07 +0200 Subject: [PATCH] Psi2Ir: fix usage of flexible vararg type after approximation This only affects JVM IR, and this is similar to how this was done in the old JVM backend in `CallBasedArgumentGenerator.generateVararg`. #KT-52146 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 +++++ .../generators/ArgumentsGenerationUtils.kt | 9 +++++-- ...t52146_samWithSelfTypeAndStarProjection.kt | 27 +++++++++++++++++++ .../sam/arrayAsVarargAfterSamArgument.ir.txt | 24 ++++++++--------- .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ 7 files changed, 69 insertions(+), 14 deletions(-) create mode 100644 compiler/testData/codegen/box/vararg/kt52146_samWithSelfTypeAndStarProjection.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 c583d2881f6..4bb9447d088 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 @@ -48371,6 +48371,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/vararg/kt46092.kt"); } + @Test + @TestMetadata("kt52146_samWithSelfTypeAndStarProjection.kt") + public void testKt52146_samWithSelfTypeAndStarProjection() throws Exception { + runTest("compiler/testData/codegen/box/vararg/kt52146_samWithSelfTypeAndStarProjection.kt"); + } + @Test @TestMetadata("kt581.kt") public void testKt581() throws Exception { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt index b46b16f5cf9..bea78b6b28b 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt @@ -299,6 +299,11 @@ private fun StatementGenerator.generateReceiverForCalleeImportedFromObject( } } +private fun StatementGenerator.computeVarargType(type: KotlinType): IrType = + // Vararg type loaded from Java can be flexible, and have `Nothing` as lower bound after approximation. (See KT-52146.) + // Its upper bound should always have the form `Array`, though. + type.upperIfFlexible().toIrType() + private fun StatementGenerator.generateVarargExpressionUsing( varargArgument: VarargValueArgument, valueParameter: ValueParameterDescriptor, @@ -319,7 +324,7 @@ private fun StatementGenerator.generateVarargExpressionUsing( val varargElementType = valueParameter.varargElementType ?: throw AssertionError("Vararg argument for non-vararg parameter $valueParameter") - val irVararg = IrVarargImpl(varargStartOffset, varargEndOffset, valueParameter.type.toIrType(), varargElementType.toIrType()) + val irVararg = IrVarargImpl(varargStartOffset, varargEndOffset, computeVarargType(valueParameter.type), varargElementType.toIrType()) for (varargElementArgument in varargArgument.arguments) { val ktArgumentExpression = varargElementArgument.getArgumentExpression() @@ -714,7 +719,7 @@ fun StatementGenerator.generateSamConversionForValueArgumentsIfRequired(call: Ca IrVarargImpl( originalArgument.startOffset, originalArgument.endOffset, - substitutedVarargType.toIrType(), + computeVarargType(substitutedVarargType), irSamType ).apply { originalArgument.elements.mapIndexedTo(elements) { index, element -> diff --git a/compiler/testData/codegen/box/vararg/kt52146_samWithSelfTypeAndStarProjection.kt b/compiler/testData/codegen/box/vararg/kt52146_samWithSelfTypeAndStarProjection.kt new file mode 100644 index 00000000000..a9ee568485e --- /dev/null +++ b/compiler/testData/codegen/box/vararg/kt52146_samWithSelfTypeAndStarProjection.kt @@ -0,0 +1,27 @@ +// TARGET_BACKEND: JVM +// FULL_JDK +// JVM_TARGET: 1.8 +// FILE: J.java + +import java.util.function.*; + +public class J, ACTUAL> { + public final SELF satisfies(Consumer... c) { + return null; + } +} + +// FILE: box.kt + +import java.util.function.* + +fun test(j: J<*, *>) { + j.satisfies(Consumer { it is CharSequence }) + j.satisfies({ it is CharSequence }) +} + +fun box(): String { + class K : J() + test(K()) + return "OK" +} diff --git a/compiler/testData/ir/irText/expressions/sam/arrayAsVarargAfterSamArgument.ir.txt b/compiler/testData/ir/irText/expressions/sam/arrayAsVarargAfterSamArgument.ir.txt index e6ef287c69d..77efa116946 100644 --- a/compiler/testData/ir/irText/expressions/sam/arrayAsVarargAfterSamArgument.ir.txt +++ b/compiler/testData/ir/irText/expressions/sam/arrayAsVarargAfterSamArgument.ir.txt @@ -21,7 +21,7 @@ FILE fqName: fileName:/arrayAsVarargAfterSamArgument.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.Unit declared in .test' GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? SPREAD_ELEMENT GET_VAR 'arr: kotlin.Array declared in .test' type=kotlin.Array origin=null TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit @@ -33,13 +33,13 @@ FILE fqName: fileName:/arrayAsVarargAfterSamArgument.kt CALL 'public open fun foo1 (r: @[FlexibleNullability] java.lang.Runnable?, vararg strs: @[FlexibleNullability] kotlin.String?): @[FlexibleNullability] kotlin.String? declared in .Test' type=@[FlexibleNullability] kotlin.String? origin=null r: TYPE_OP type=@[FlexibleNullability] java.lang.Runnable? origin=SAM_CONVERSION typeOperand=@[FlexibleNullability] java.lang.Runnable? GET_VAR 'fn: kotlin.Function0 declared in .test' type=kotlin.Function0 origin=null - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? SPREAD_ELEMENT GET_VAR 'arr: kotlin.Array declared in .test' type=kotlin.Array origin=null TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit CALL 'public open fun foo1 (r: @[FlexibleNullability] java.lang.Runnable?, vararg strs: @[FlexibleNullability] kotlin.String?): @[FlexibleNullability] kotlin.String? declared in .Test' type=@[FlexibleNullability] kotlin.String? origin=null r: GET_VAR 'r: java.lang.Runnable declared in .test' type=java.lang.Runnable origin=null - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? CONST String type=kotlin.String value="" TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit CALL 'public open fun foo1 (r: @[FlexibleNullability] java.lang.Runnable?, vararg strs: @[FlexibleNullability] kotlin.String?): @[FlexibleNullability] kotlin.String? declared in .Test' type=@[FlexibleNullability] kotlin.String? origin=null @@ -50,13 +50,13 @@ FILE fqName: fileName:/arrayAsVarargAfterSamArgument.kt CALL 'public open fun foo1 (r: @[FlexibleNullability] java.lang.Runnable?, vararg strs: @[FlexibleNullability] kotlin.String?): @[FlexibleNullability] kotlin.String? declared in .Test' type=@[FlexibleNullability] kotlin.String? origin=null r: TYPE_OP type=@[FlexibleNullability] java.lang.Runnable? origin=SAM_CONVERSION typeOperand=@[FlexibleNullability] java.lang.Runnable? GET_VAR 'fn: kotlin.Function0 declared in .test' type=kotlin.Function0 origin=null - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? SPREAD_ELEMENT GET_VAR 'arr: kotlin.Array declared in .test' type=kotlin.Array origin=null TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit CALL 'public open fun foo1 (r: @[FlexibleNullability] java.lang.Runnable?, vararg strs: @[FlexibleNullability] kotlin.String?): @[FlexibleNullability] kotlin.String? declared in .Test' type=@[FlexibleNullability] kotlin.String? origin=null r: GET_VAR 'r: java.lang.Runnable declared in .test' type=java.lang.Runnable origin=null - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? SPREAD_ELEMENT GET_VAR 'arr: kotlin.Array declared in .test' type=kotlin.Array origin=null VAR name:i1 type:.Test [val] @@ -76,7 +76,7 @@ FILE fqName: fileName:/arrayAsVarargAfterSamArgument.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.Unit declared in .test' GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? SPREAD_ELEMENT GET_VAR 'arr: kotlin.Array declared in .test' type=kotlin.Array origin=null VAR name:i3 type:.Test [val] @@ -103,7 +103,7 @@ FILE fqName: fileName:/arrayAsVarargAfterSamArgument.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.Unit declared in .test' GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? CONST String type=kotlin.String value="" VAR name:i5 type:.Test [val] CONSTRUCTOR_CALL 'public constructor (r1: @[FlexibleNullability] java.lang.Runnable?, r2: @[FlexibleNullability] java.lang.Runnable?, vararg strs: @[FlexibleNullability] kotlin.String?) declared in .Test' type=.Test origin=null @@ -119,7 +119,7 @@ FILE fqName: fileName:/arrayAsVarargAfterSamArgument.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.Unit declared in .test' GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? SPREAD_ELEMENT GET_VAR 'arr: kotlin.Array declared in .test' type=kotlin.Array origin=null VAR name:i6 type:.Test [val] @@ -131,7 +131,7 @@ FILE fqName: fileName:/arrayAsVarargAfterSamArgument.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.Unit declared in .test' GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? SPREAD_ELEMENT GET_VAR 'arr: kotlin.Array declared in .test' type=kotlin.Array origin=null TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit @@ -160,7 +160,7 @@ FILE fqName: fileName:/arrayAsVarargAfterSamArgument.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.Unit declared in .test' GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? CONST String type=kotlin.String value="" TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit CALL 'public open fun foo2 (r1: @[FlexibleNullability] java.lang.Runnable?, r2: @[FlexibleNullability] java.lang.Runnable?, vararg strs: @[FlexibleNullability] kotlin.String?): @[FlexibleNullability] kotlin.String? declared in .Test' type=@[FlexibleNullability] kotlin.String? origin=null @@ -177,7 +177,7 @@ FILE fqName: fileName:/arrayAsVarargAfterSamArgument.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.Unit declared in .test' GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? SPREAD_ELEMENT GET_VAR 'arr: kotlin.Array declared in .test' type=kotlin.Array origin=null TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit @@ -190,6 +190,6 @@ FILE fqName: fileName:/arrayAsVarargAfterSamArgument.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.Unit declared in .test' GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit - strs: VARARG type=@[FlexibleNullability] kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? + strs: VARARG type=kotlin.Array? varargElementType=@[FlexibleNullability] kotlin.String? SPREAD_ELEMENT GET_VAR 'arr: kotlin.Array declared in .test' type=kotlin.Array origin=null 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 86113f1316b..32d6398d5a8 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 @@ -47783,6 +47783,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/vararg/kt46092.kt"); } + @Test + @TestMetadata("kt52146_samWithSelfTypeAndStarProjection.kt") + public void testKt52146_samWithSelfTypeAndStarProjection() throws Exception { + runTest("compiler/testData/codegen/box/vararg/kt52146_samWithSelfTypeAndStarProjection.kt"); + } + @Test @TestMetadata("kt581.kt") public void testKt581() 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 733bd623b84..29b21c03f96 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 @@ -48371,6 +48371,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/vararg/kt46092.kt"); } + @Test + @TestMetadata("kt52146_samWithSelfTypeAndStarProjection.kt") + public void testKt52146_samWithSelfTypeAndStarProjection() throws Exception { + runTest("compiler/testData/codegen/box/vararg/kt52146_samWithSelfTypeAndStarProjection.kt"); + } + @Test @TestMetadata("kt581.kt") public void testKt581() 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 4ff02979d0e..37afdd40688 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -38875,6 +38875,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/vararg/kt46092.kt"); } + @TestMetadata("kt52146_samWithSelfTypeAndStarProjection.kt") + public void testKt52146_samWithSelfTypeAndStarProjection() throws Exception { + runTest("compiler/testData/codegen/box/vararg/kt52146_samWithSelfTypeAndStarProjection.kt"); + } + @TestMetadata("kt581.kt") public void testKt581() throws Exception { runTest("compiler/testData/codegen/box/vararg/kt581.kt");