From 3e45a1529ce0d07847dac6bb70da64da620c51ef Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Thu, 14 Jun 2018 12:55:54 +0300 Subject: [PATCH] Allow to declare `vararg` parameters of unsigned types varargs inside annotations will be supported later when constant evaluation of more complex expressions of unsigned types will be ready #KT-24880 In Progress --- .../kotlin/resolve/DeclarationsChecker.kt | 5 +++- .../allowedVarargsOfUnsignedTypes.kt | 14 +++++++++++ .../allowedVarargsOfUnsignedTypes.txt | 23 +++++++++++++++++++ ...DiagnosticsWithUnsignedTypesGenerated.java | 5 ++++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/testsWithUnsignedTypes/allowedVarargsOfUnsignedTypes.kt create mode 100644 compiler/testData/diagnostics/testsWithUnsignedTypes/allowedVarargsOfUnsignedTypes.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index b953e472189..36aa0ac2807 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve import com.google.common.collect.ImmutableSet import com.intellij.psi.PsiElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.builtins.UnsignedTypes import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* @@ -921,7 +922,9 @@ class DeclarationsChecker( val nullableNothing = callableDescriptor.builtIns.nullableNothingType for (parameter in varargParameters) { val varargElementType = parameter.varargElementType!!.upperIfFlexible() - if (KotlinTypeChecker.DEFAULT.isSubtypeOf(varargElementType, nullableNothing) || varargElementType.isInlineClassType()) { + if (KotlinTypeChecker.DEFAULT.isSubtypeOf(varargElementType, nullableNothing) || + (varargElementType.isInlineClassType() && !UnsignedTypes.isUnsignedType(varargElementType)) + ) { val parameterDeclaration = DescriptorToSourceUtils.descriptorToDeclaration(parameter) as? KtParameter ?: continue trace.report(FORBIDDEN_VARARG_PARAMETER_TYPE.on(parameterDeclaration, varargElementType)) } diff --git a/compiler/testData/diagnostics/testsWithUnsignedTypes/allowedVarargsOfUnsignedTypes.kt b/compiler/testData/diagnostics/testsWithUnsignedTypes/allowedVarargsOfUnsignedTypes.kt new file mode 100644 index 00000000000..598ada82f02 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithUnsignedTypes/allowedVarargsOfUnsignedTypes.kt @@ -0,0 +1,14 @@ +// !LANGUAGE: +InlineClasses +// !SKIP_METADATA_VERSION_CHECK +// !DIAGNOSTICS: -UNUSED_PARAMETER + +fun ubyte(vararg a: UByte) {} +fun ushort(vararg a: UShort) {} +fun uint(vararg a: UInt) {} +fun ulong(vararg a: ULong) {} + +class ValueParam(vararg val a: ULong) + +annotation class Ann(vararg val a: UInt) + +fun array(vararg a: UIntArray) {} diff --git a/compiler/testData/diagnostics/testsWithUnsignedTypes/allowedVarargsOfUnsignedTypes.txt b/compiler/testData/diagnostics/testsWithUnsignedTypes/allowedVarargsOfUnsignedTypes.txt new file mode 100644 index 00000000000..c85d8ccf888 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithUnsignedTypes/allowedVarargsOfUnsignedTypes.txt @@ -0,0 +1,23 @@ +package + +public fun array(/*0*/ vararg a: kotlin.UIntArray /*kotlin.Array*/): kotlin.Unit +public fun ubyte(/*0*/ vararg a: kotlin.UByte /*kotlin.Array*/): kotlin.Unit +public fun uint(/*0*/ vararg a: kotlin.UInt /*kotlin.Array*/): kotlin.Unit +public fun ulong(/*0*/ vararg a: kotlin.ULong /*kotlin.Array*/): kotlin.Unit +public fun ushort(/*0*/ vararg a: kotlin.UShort /*kotlin.Array*/): kotlin.Unit + +public final annotation class Ann : kotlin.Annotation { + public constructor Ann(/*0*/ vararg a: kotlin.UInt /*kotlin.Array*/) + public final val a: kotlin.Array + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class ValueParam { + public constructor ValueParam(/*0*/ vararg a: kotlin.ULong /*kotlin.Array*/) + public final val a: kotlin.Array + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java index 9421d8893a6..6afb0f2c8e0 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java @@ -29,6 +29,11 @@ public class DiagnosticsWithUnsignedTypesGenerated extends AbstractDiagnosticsWi KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithUnsignedTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("allowedVarargsOfUnsignedTypes.kt") + public void testAllowedVarargsOfUnsignedTypes() throws Exception { + runTest("compiler/testData/diagnostics/testsWithUnsignedTypes/allowedVarargsOfUnsignedTypes.kt"); + } + @TestMetadata("forbiddenEqualsOnUnsignedTypes.kt") public void testForbiddenEqualsOnUnsignedTypes() throws Exception { runTest("compiler/testData/diagnostics/testsWithUnsignedTypes/forbiddenEqualsOnUnsignedTypes.kt");