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
This commit is contained in:
Mikhail Zarechenskiy
2018-06-14 12:55:54 +03:00
parent 3f462659d2
commit 3e45a1529c
4 changed files with 46 additions and 1 deletions
@@ -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))
}
@@ -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: <!INVALID_TYPE_OF_ANNOTATION_MEMBER!>UInt<!>)
fun array(<!FORBIDDEN_VARARG_PARAMETER_TYPE!>vararg<!> a: UIntArray) {}
@@ -0,0 +1,23 @@
package
public fun array(/*0*/ vararg a: kotlin.UIntArray /*kotlin.Array<out kotlin.UIntArray>*/): kotlin.Unit
public fun ubyte(/*0*/ vararg a: kotlin.UByte /*kotlin.Array<out kotlin.UByte>*/): kotlin.Unit
public fun uint(/*0*/ vararg a: kotlin.UInt /*kotlin.Array<out kotlin.UInt>*/): kotlin.Unit
public fun ulong(/*0*/ vararg a: kotlin.ULong /*kotlin.Array<out kotlin.ULong>*/): kotlin.Unit
public fun ushort(/*0*/ vararg a: kotlin.UShort /*kotlin.Array<out kotlin.UShort>*/): kotlin.Unit
public final annotation class Ann : kotlin.Annotation {
public constructor Ann(/*0*/ vararg a: kotlin.UInt /*kotlin.Array<out kotlin.UInt>*/)
public final val a: kotlin.Array<out kotlin.UInt>
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<out kotlin.ULong>*/)
public final val a: kotlin.Array<out kotlin.ULong>
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
}
@@ -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");