[FIR] Generate spread element for unsigned arrays

Previously when unsigned arrays were passed as vararg in a named form the necessary spread element wasn't generated, which resulted in a compilation error.

^KT-63514 fixed
This commit is contained in:
Nikita Nazarov
2023-12-08 16:04:42 +01:00
committed by Space Cloud
parent dbca7358af
commit 251fdb21c9
22 changed files with 153 additions and 2 deletions
@@ -55076,6 +55076,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -55076,6 +55076,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.dump
import org.jetbrains.kotlin.ir.util.isPrimitiveArray
import org.jetbrains.kotlin.ir.util.isUnsignedArray
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator.commonSuperType
import org.jetbrains.kotlin.types.Variance
@@ -1091,7 +1092,7 @@ class CallAndReferenceGenerator(
if (argument.arguments[0] is FirNamedArgumentExpression &&
// IrVarargElement can be either IrSpreadElement (then nothing to do) or IrExpression
irVarargElement is IrExpression &&
(irVarargElement.type.isArray() || irVarargElement.type.isPrimitiveArray())
(irVarargElement.type.isArray() || irVarargElement.type.isPrimitiveArray() || irVarargElement.type.isUnsignedArray())
) {
elements[0] = IrSpreadElementImpl(irVarargElement.startOffset, irVarargElement.endOffset, irVarargElement)
}
@@ -54477,6 +54477,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -54477,6 +54477,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -54477,6 +54477,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -34,7 +34,9 @@ import org.jetbrains.kotlin.resolve.calls.model.*
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
import org.jetbrains.kotlin.resolve.calls.tasks.OldResolutionCandidate
import org.jetbrains.kotlin.resolve.calls.tower.*
import org.jetbrains.kotlin.resolve.descriptorUtil.inlineClassRepresentation
import org.jetbrains.kotlin.resolve.descriptorUtil.isParameterOfAnnotation
import org.jetbrains.kotlin.resolve.isInlineClassType
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes
import org.jetbrains.kotlin.resolve.scopes.collectSyntheticConstructors
@@ -279,7 +281,7 @@ fun isArrayOrArrayLiteral(argument: ValueArgument, trace: BindingTrace): Boolean
if (argumentExpression is KtCollectionLiteralExpression) return true
val type = trace.getType(argumentExpression) ?: return false
return KotlinBuiltIns.isArrayOrPrimitiveArray(type)
return KotlinBuiltIns.isArrayOrPrimitiveArray(type) || KotlinBuiltIns.isUnsignedArrayType(type)
}
fun createResolutionCandidatesForConstructors(
@@ -0,0 +1,35 @@
// !LANGUAGE: +AllowAssigningArrayElementsToVarargsInNamedFormForFunctions
// ISSUE: KT-63514
// WITH_STDLIB
fun foo(vararg arr: Int): Int {
return arr.sum()
}
fun bar(vararg arr: UInt): UInt {
return arr.sum()
}
fun baz(vararg arr: ULong): ULong {
return arr.sum()
}
fun quas(vararg arr: UShort): UInt {
return arr.sum()
}
fun wex(vararg arr: UByte): UInt {
return arr.sum()
}
fun box(): String {
val x = foo(arr = intArrayOf(1, 2, 3))
val y = bar(arr = uintArrayOf(1u, 2u, 3u))
val z = baz(arr = ulongArrayOf(1uL, 2uL, 3uL))
val q = quas(arr = ushortArrayOf(1u, 2u, 3u))
val w = wex(arr = ubyteArrayOf(1u, 2u, 3u))
if (x + y.toInt() + z.toInt() + q.toInt() + w.toInt() == 30) {
return "OK"
}
return "Fail"
}
@@ -51159,6 +51159,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -54477,6 +54477,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -54477,6 +54477,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -44094,6 +44094,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
runTest("compiler/testData/codegen/box/vararg/kt10926.kt");
@@ -37839,6 +37839,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -37839,6 +37839,12 @@ public class FirJsES6CodegenBoxTestGenerated extends AbstractFirJsES6CodegenBoxT
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -37839,6 +37839,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -37839,6 +37839,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -41612,6 +41612,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -42676,6 +42676,12 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -40548,6 +40548,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -41613,6 +41613,12 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -37731,6 +37731,12 @@ public class FirWasmCodegenBoxTestGenerated extends AbstractFirWasmCodegenBoxTes
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {
@@ -37731,6 +37731,12 @@ public class K1WasmCodegenBoxTestGenerated extends AbstractK1WasmCodegenBoxTest
runTest("compiler/testData/codegen/box/vararg/evaluationOrder.kt");
}
@Test
@TestMetadata("inlineClassArraysAsNamedArgumentInVararg.kt")
public void testInlineClassArraysAsNamedArgumentInVararg() throws Exception {
runTest("compiler/testData/codegen/box/vararg/inlineClassArraysAsNamedArgumentInVararg.kt");
}
@Test
@TestMetadata("kt10926.kt")
public void testKt10926() throws Exception {