Prohibit non-const expressions through varargs in annotations
Fixes #KT-23153 for Kotlin 1.3 The problem was in the type check of expression type against expected type. When feature `AssigningArraysToVarargsInNamedFormInAnnotations` (KT-20171) appeared, expected type could be wrong, which led to failed type check
This commit is contained in:
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
// !LANGUAGE: -ProhibitNonConstValuesAsVarargsInAnnotations
|
||||
|
||||
val nonConstArray = longArrayOf(0)
|
||||
fun nonConstFun(): LongArray = TODO()
|
||||
|
||||
fun nonConstLong(): Long = TODO()
|
||||
|
||||
annotation class Anno(vararg val value: Long)
|
||||
|
||||
@Anno(value = <!ANNOTATION_ARGUMENT_IS_NON_CONST!>nonConstArray<!>)
|
||||
fun foo1() {}
|
||||
|
||||
@Anno(value = <!ANNOTATION_ARGUMENT_IS_NON_CONST!>nonConstFun()<!>)
|
||||
fun foo2() {}
|
||||
|
||||
@Anno(value = <!ANNOTATION_ARGUMENT_IS_NON_CONST!>longArrayOf(<!ANNOTATION_ARGUMENT_IS_NON_CONST!>nonConstLong()<!>)<!>)
|
||||
fun foo3() {}
|
||||
|
||||
@Anno(value = <!ANNOTATION_ARGUMENT_IS_NON_CONST!>[<!ANNOTATION_ARGUMENT_IS_NON_CONST!>nonConstLong()<!>]<!>)
|
||||
fun foo4() {}
|
||||
|
||||
@Anno(value = *<!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION, ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstArray<!>)
|
||||
fun bar1() {}
|
||||
|
||||
@Anno(*<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstArray<!>)
|
||||
fun bar2() {}
|
||||
compiler/testData/diagnostics/tests/varargs/assignNonConstSingleArrayElementAsVarargInAnnotation.txt
Vendored
+19
@@ -0,0 +1,19 @@
|
||||
package
|
||||
|
||||
public val nonConstArray: kotlin.LongArray
|
||||
@Anno public fun bar1(): kotlin.Unit
|
||||
@Anno public fun bar2(): kotlin.Unit
|
||||
@Anno(value = {}) public fun foo1(): kotlin.Unit
|
||||
@Anno(value = {}) public fun foo2(): kotlin.Unit
|
||||
@Anno(value = {}) public fun foo3(): kotlin.Unit
|
||||
@Anno(value = {}) public fun foo4(): kotlin.Unit
|
||||
public fun nonConstFun(): kotlin.LongArray
|
||||
public fun nonConstLong(): kotlin.Long
|
||||
|
||||
public final annotation class Anno : kotlin.Annotation {
|
||||
public constructor Anno(/*0*/ vararg value: kotlin.Long /*kotlin.LongArray*/)
|
||||
public final val value: kotlin.LongArray
|
||||
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
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// !LANGUAGE: +ProhibitNonConstValuesAsVarargsInAnnotations
|
||||
|
||||
val nonConstArray = longArrayOf(0)
|
||||
fun nonConstFun(): LongArray = TODO()
|
||||
|
||||
fun nonConstLong(): Long = TODO()
|
||||
|
||||
annotation class Anno(vararg val value: Long)
|
||||
|
||||
@Anno(value = <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstArray<!>)
|
||||
fun foo1() {}
|
||||
|
||||
@Anno(value = <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstFun()<!>)
|
||||
fun foo2() {}
|
||||
|
||||
@Anno(value = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>longArrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstLong()<!>)<!>)
|
||||
fun foo3() {}
|
||||
|
||||
@Anno(value = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>[<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstLong()<!>]<!>)
|
||||
fun foo4() {}
|
||||
|
||||
@Anno(value = *<!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION, ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstArray<!>)
|
||||
fun bar1() {}
|
||||
|
||||
@Anno(*<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstArray<!>)
|
||||
fun bar2() {}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package
|
||||
|
||||
public val nonConstArray: kotlin.LongArray
|
||||
@Anno public fun bar1(): kotlin.Unit
|
||||
@Anno public fun bar2(): kotlin.Unit
|
||||
@Anno(value = {}) public fun foo1(): kotlin.Unit
|
||||
@Anno(value = {}) public fun foo2(): kotlin.Unit
|
||||
@Anno(value = {}) public fun foo3(): kotlin.Unit
|
||||
@Anno(value = {}) public fun foo4(): kotlin.Unit
|
||||
public fun nonConstFun(): kotlin.LongArray
|
||||
public fun nonConstLong(): kotlin.Long
|
||||
|
||||
public final annotation class Anno : kotlin.Annotation {
|
||||
public constructor Anno(/*0*/ vararg value: kotlin.Long /*kotlin.LongArray*/)
|
||||
public final val value: kotlin.LongArray
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user