Support constant evaluation of unsigned type constructors
#KT-23816 In Progress
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// !SKIP_METADATA_VERSION_CHECK
|
||||
// WITH_UNSIGNED
|
||||
|
||||
@file:Suppress("INVISIBLE_MEMBER")
|
||||
|
||||
annotation class AnnoUB(val ub0: UByte, val ub1: UByte)
|
||||
annotation class AnnoUS(val us0: UShort, val us1: UShort)
|
||||
annotation class AnnoUI(val ui0: UInt, val ui1: UInt, val ui2: UInt, val ui3: UInt)
|
||||
annotation class AnnoUL(val ul0: ULong, val ul1: ULong)
|
||||
|
||||
const val ub0 = UByte(1)
|
||||
const val us0 = UShort(2)
|
||||
const val ul0 = ULong(3)
|
||||
|
||||
const val ui0 = UInt(-1)
|
||||
const val ui1 = UInt(0)
|
||||
const val ui2 = UInt(40 + 2)
|
||||
|
||||
object Foo {
|
||||
@AnnoUB(UByte(1), ub0)
|
||||
fun f0() {}
|
||||
|
||||
@AnnoUS(UShort(2 + 5), us0)
|
||||
fun f1() {}
|
||||
|
||||
@AnnoUI(ui0, ui1, ui2, UInt(100))
|
||||
fun f2() {}
|
||||
|
||||
@AnnoUL(ul0, ULong(5))
|
||||
fun f3() {}
|
||||
}
|
||||
|
||||
fun <T> check(ann: Annotation, f: T.() -> Boolean) {
|
||||
val result = (ann as T).f()
|
||||
if (!result) throw RuntimeException("fail for $ann")
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
if (ub0.toByte() != 1.toByte()) return "fail"
|
||||
if (us0.toShort() != 2.toShort()) return "fail"
|
||||
if (ul0.toLong() != 3L) return "fail"
|
||||
if ((ui0 + ui1 + ui2).toInt() != 41) return "fail"
|
||||
|
||||
check<AnnoUB>(Foo::f0.annotations.first()) {
|
||||
this.ub0 == UByte(1) && this.ub1 == UByte(1)
|
||||
}
|
||||
|
||||
check<AnnoUS>(Foo::f1.annotations.first()) {
|
||||
this.us0 == UShort(7) && this.us1 == UShort(2)
|
||||
}
|
||||
|
||||
check<AnnoUI>(Foo::f2.annotations.first()) {
|
||||
this.ui0 == UInt.MAX_VALUE && this.ui1 == UInt(0) && this.ui2 == UInt(42) && this.ui3 == UInt(100)
|
||||
}
|
||||
|
||||
check<AnnoUL>(Foo::f3.annotations.first()) {
|
||||
this.ul0 == ULong(3) && this.ul1 == ULong(5)
|
||||
}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
|
||||
// FILE: uint.kt
|
||||
|
||||
package kotlin
|
||||
|
||||
inline class UInt(val value: Int)
|
||||
|
||||
// FILE: test.kt
|
||||
|
||||
const val u = UInt(14)
|
||||
|
||||
fun foo() {
|
||||
u
|
||||
if (u.value != 14) {}
|
||||
}
|
||||
|
||||
// @TestKt.class:
|
||||
// 0 GETSTATIC
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
|
||||
// FILE: uint.kt
|
||||
|
||||
package kotlin
|
||||
|
||||
inline class UByte(private val b: Byte)
|
||||
inline class UShort(private val s: Short)
|
||||
inline class UInt(private val i: Int)
|
||||
inline class ULong(private val l: Long)
|
||||
|
||||
// FILE: test.kt
|
||||
|
||||
annotation class AnnoUB(val ub0: UByte, val ub1: UByte)
|
||||
annotation class AnnoUS(val us0: UShort, val us1: UShort)
|
||||
annotation class AnnoUI(val ui0: UInt, val ui1: UInt, val ui2: UInt, val ui3: UInt)
|
||||
annotation class AnnoUL(val ul0: ULong, val ul1: ULong)
|
||||
|
||||
const val ub0 = UByte(1)
|
||||
const val us0 = UShort(2)
|
||||
const val ul0 = ULong(3)
|
||||
|
||||
const val ui0 = UInt(-1)
|
||||
const val ui1 = UInt(0)
|
||||
const val ui2 = UInt(40 + 2)
|
||||
|
||||
@AnnoUB(UByte(1), ub0)
|
||||
fun f0() {}
|
||||
|
||||
@AnnoUS(UShort(2 + 5), us0)
|
||||
fun f1() {}
|
||||
|
||||
@AnnoUI(ui0, ui1, ui2, UInt(100))
|
||||
fun f2() {}
|
||||
|
||||
@AnnoUL(ul0, ULong(5))
|
||||
fun f3() {}
|
||||
|
||||
const val explicit: UInt = UInt(2)
|
||||
|
||||
<!TYPE_CANT_BE_USED_FOR_CONST_VAL!>const<!> val nullable: UInt? = UInt(3)
|
||||
|
||||
annotation class NullableAnno(val u: <!NULLABLE_TYPE_OF_ANNOTATION_MEMBER!>UInt?<!>)
|
||||
+140
@@ -0,0 +1,140 @@
|
||||
package
|
||||
|
||||
public const val explicit: kotlin.UInt = 2.toUInt()
|
||||
public const val nullable: kotlin.UInt? = 3.toUInt()
|
||||
public const val ub0: kotlin.UByte = 1.toUByte()
|
||||
public const val ui0: kotlin.UInt = -1.toUInt()
|
||||
public const val ui1: kotlin.UInt = 0.toUInt()
|
||||
public const val ui2: kotlin.UInt = 42.toUInt()
|
||||
public const val ul0: kotlin.ULong = 3.toULong()
|
||||
public const val us0: kotlin.UShort = 2.toUShort()
|
||||
@AnnoUB(ub0 = 1.toUByte(), ub1 = 1.toByte()) public fun f0(): kotlin.Unit
|
||||
@AnnoUS(us0 = 7.toUShort(), us1 = 2.toShort()) public fun f1(): kotlin.Unit
|
||||
@AnnoUI(ui0 = -1, ui1 = 0, ui2 = 42, ui3 = 100.toUInt()) public fun f2(): kotlin.Unit
|
||||
@AnnoUL(ul0 = 3.toLong(), ul1 = 5.toULong()) public fun f3(): kotlin.Unit
|
||||
|
||||
public final annotation class AnnoUB : kotlin.Annotation {
|
||||
public constructor AnnoUB(/*0*/ ub0: kotlin.UByte, /*1*/ ub1: kotlin.UByte)
|
||||
public final val ub0: kotlin.UByte
|
||||
public final val ub1: kotlin.UByte
|
||||
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 annotation class AnnoUI : kotlin.Annotation {
|
||||
public constructor AnnoUI(/*0*/ ui0: kotlin.UInt, /*1*/ ui1: kotlin.UInt, /*2*/ ui2: kotlin.UInt, /*3*/ ui3: kotlin.UInt)
|
||||
public final val ui0: kotlin.UInt
|
||||
public final val ui1: kotlin.UInt
|
||||
public final val ui2: kotlin.UInt
|
||||
public final val ui3: 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 annotation class AnnoUL : kotlin.Annotation {
|
||||
public constructor AnnoUL(/*0*/ ul0: kotlin.ULong, /*1*/ ul1: kotlin.ULong)
|
||||
public final val ul0: kotlin.ULong
|
||||
public final val ul1: 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
|
||||
}
|
||||
|
||||
public final annotation class AnnoUS : kotlin.Annotation {
|
||||
public constructor AnnoUS(/*0*/ us0: kotlin.UShort, /*1*/ us1: kotlin.UShort)
|
||||
public final val us0: kotlin.UShort
|
||||
public final val us1: kotlin.UShort
|
||||
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 annotation class NullableAnno : kotlin.Annotation {
|
||||
public constructor NullableAnno(/*0*/ u: kotlin.UInt?)
|
||||
public final val u: 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
|
||||
}
|
||||
|
||||
package kotlin {
|
||||
|
||||
public final inline class UByte {
|
||||
public constructor UByte(/*0*/ b: kotlin.Byte)
|
||||
private final val b: kotlin.Byte
|
||||
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 inline class UInt {
|
||||
public constructor UInt(/*0*/ i: kotlin.Int)
|
||||
private final val i: kotlin.Int
|
||||
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 inline class ULong {
|
||||
public constructor ULong(/*0*/ l: kotlin.Long)
|
||||
private final val l: kotlin.Long
|
||||
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 inline class UShort {
|
||||
public constructor UShort(/*0*/ s: kotlin.Short)
|
||||
private final val s: kotlin.Short
|
||||
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
|
||||
}
|
||||
|
||||
package kotlin.annotation {
|
||||
}
|
||||
|
||||
package kotlin.collections {
|
||||
}
|
||||
|
||||
package kotlin.internal {
|
||||
|
||||
package kotlin.internal.contracts {
|
||||
}
|
||||
}
|
||||
|
||||
package kotlin.ranges {
|
||||
}
|
||||
|
||||
package kotlin.reflect {
|
||||
}
|
||||
|
||||
package kotlin.script {
|
||||
|
||||
package kotlin.script.dependencies {
|
||||
}
|
||||
|
||||
package kotlin.script.experimental {
|
||||
|
||||
package kotlin.script.experimental.dependencies {
|
||||
}
|
||||
|
||||
package kotlin.script.experimental.location {
|
||||
}
|
||||
}
|
||||
|
||||
package kotlin.script.extensions {
|
||||
}
|
||||
|
||||
package kotlin.script.templates {
|
||||
|
||||
package kotlin.script.templates.standard {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
package kotlin.text {
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
inline class MyInt(val x: Int)
|
||||
inline class MyString(val x: String)
|
||||
|
||||
annotation class Ann1(val a: <!INVALID_TYPE_OF_ANNOTATION_MEMBER!>MyInt<!>)
|
||||
annotation class Ann2(val a: <!INVALID_TYPE_OF_ANNOTATION_MEMBER!>Array<MyString><!>)
|
||||
annotation class Ann3(<!FORBIDDEN_VARARG_PARAMETER_TYPE!>vararg<!> val a: <!INVALID_TYPE_OF_ANNOTATION_MEMBER!>MyInt<!>)
|
||||
|
||||
annotation class Ann4(val a: KClass<MyInt>)
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
package
|
||||
|
||||
public final annotation class Ann1 : kotlin.Annotation {
|
||||
public constructor Ann1(/*0*/ a: MyInt)
|
||||
public final val a: MyInt
|
||||
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 annotation class Ann2 : kotlin.Annotation {
|
||||
public constructor Ann2(/*0*/ a: kotlin.Array<MyString>)
|
||||
public final val a: kotlin.Array<MyString>
|
||||
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 annotation class Ann3 : kotlin.Annotation {
|
||||
public constructor Ann3(/*0*/ vararg a: MyInt /*kotlin.Array<out MyInt>*/)
|
||||
public final val a: kotlin.Array<out MyInt>
|
||||
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 annotation class Ann4 : kotlin.Annotation {
|
||||
public constructor Ann4(/*0*/ a: kotlin.reflect.KClass<MyInt>)
|
||||
public final val a: kotlin.reflect.KClass<MyInt>
|
||||
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 inline class MyInt {
|
||||
public constructor MyInt(/*0*/ x: kotlin.Int)
|
||||
public final val x: kotlin.Int
|
||||
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 inline class MyString {
|
||||
public constructor MyString(/*0*/ x: kotlin.String)
|
||||
public final val x: kotlin.String
|
||||
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