From 66995fe1a54610c24292536db4db5d4648c4b311 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 6 Apr 2020 19:28:32 +0200 Subject: [PATCH] Fix condition in calculation of adapted function reference flags This only affects flags which are passed to kotlin.jvm.internal.AdaptedFunctionReference. The only way it could lead to changes in behavior is if it affected equals/hashCode of adapted references. But it doesn't seem possible to construct a test where two _different_ adaptations exist for a function reference to a vararg-taking function, both of which use some sort of 1.4 function reference conversion. Hence, no new tests are added. --- .../src/org/jetbrains/kotlin/codegen/ClosureCodegen.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index a52a4c6acc9..97b816b1f5d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -561,8 +561,13 @@ public class ClosureCodegen extends MemberCodegen { for (int i = shift; i < anonymousAdaptedFunction.getValueParameters().size() && i - shift < target.getValueParameters().size(); i++) { - KotlinType varargElementType = target.getValueParameters().get(i - shift).getVarargElementType(); - if (varargElementType != null && !varargElementType.equals(anonymousAdaptedFunction.getValueParameters().get(i).getType())) { + ValueParameterDescriptor targetParameter = target.getValueParameters().get(i - shift); + ValueParameterDescriptor adaptedParameter = anonymousAdaptedFunction.getValueParameters().get(i); + + // Vararg to element conversion is happening if the target parameter is vararg (e.g. `vararg xs: Int`), + // but the adapted parameter's type is not equal to the target parameter's type (which is `IntArray`). + if (targetParameter.getVarargElementType() != null && + !targetParameter.getType().equals(adaptedParameter.getType())) { hasVarargMappedToElement = true; break; }