This commit is contained in:
Konstantin Anisimov
2017-02-02 17:11:57 +07:00
2766 changed files with 76538 additions and 1382 deletions
+206 -96
View File
@@ -1,3 +1,6 @@
import groovy.json.JsonOutput
import org.jetbrains.kotlin.*
configurations {
cli_bc
}
@@ -6,107 +9,76 @@ dependencies {
cli_bc project(path: ':backend.native', configuration: 'cli_bc')
}
def testOutputRoot = rootProject.file("test.output").absolutePath
def externalTestsDir = project.file("external")
allprojects {
// Root directories for test output (logs, compiled files, statistics etc). Only single path must be in each set.
sourceSets {
// backend.native/tests
testOutputLocal {
output.dir(rootProject.file("$testOutputRoot/local"))
}
abstract class KonanTest extends DefaultTask {
protected String source
def backendNative = project.project(":backend.native")
def runtimeProject = project.project(":runtime")
def dist = project.parent.parent.file("dist")
def llvmLlc = llvmTool("llc")
def runtimeBc = new File("${dist.canonicalPath}/lib/runtime.bc").absolutePath
def launcherBc = new File("${dist.canonicalPath}/lib/launcher.bc").absolutePath
def startKtBc = new File("${dist.canonicalPath}/lib/start.kt.bc").absolutePath
def stdlibKtBc = new File("${dist.canonicalPath}/lib/stdlib.kt.bc").absolutePath
def mainC = 'main.c'
String goldValue = null
String testData = null
List<String> arguments = null
boolean enabled = true
public void setDisabled(boolean value) {
this.enabled = !value
}
public KonanTest(){
// TODO: that's a long reach up the project tree.
// May be we should reorganize a little.
dependsOn(project.parent.parent.tasks['dist'])
}
abstract void compileTest(String source, String exe)
protected void runCompiler(String source, String output, List<String> moreArgs) {
project.javaexec {
main = 'org.jetbrains.kotlin.cli.bc.K2NativeKt'
classpath = project.configurations.cli_bc
jvmArgs "-ea",
"-Dkonan.home=${dist.canonicalPath}",
"-Djava.library.path=${dist.canonicalPath}/konan/nativelib"
args("-output", output,
source,
*moreArgs,
*project.globalArgs)
// backend.native/tests/external
testOutputExternal {
output.dir(rootProject.file("$testOutputRoot/external"))
}
}
@TaskAction
void executeTest() {
def sourceKt = project.file(source).absolutePath
def exe = sourceKt.replace(".kt", ".kt.exe")
compileTest(sourceKt, exe)
println "execution :$exe"
def out = null
project.exec {
commandLine exe
if (arguments != null) {
args arguments
}
if (testData != null) {
standardInput = new ByteArrayInputStream(testData.bytes)
}
if (goldValue != null) {
out = new ByteArrayOutputStream()
standardOutput = out
}
}
if (goldValue != null && goldValue != out.toString())
throw new RuntimeException("test failed")
}
private String llvmTool(String tool) {
return "${project.llvmDir}/bin/${tool}"
}
protected List<String> clangLinkArgs() {
return project.clangLinkArgs
}
}
class RunKonanTest extends KonanTest {
void compileTest(String source, String exe) {
runCompiler(source, exe, [])
task clean {
doLast {
delete(rootProject.file(testOutputRoot))
}
}
class LinkKonanTest extends KonanTest {
protected String lib
void compileTest(String source, String exe) {
def libDir = project.file(lib).absolutePath
def libBc = "${libDir}.bc"
runCompiler(lib, libBc, ['-nolink', '-nostdlib'])
runCompiler(source, exe, ['-library', libBc])
}
}
task run() {
dependsOn(tasks.withType(KonanTest).matching { it.enabled })
dependsOn(tasks.withType(KonanTest).matching { !(it instanceof RunExternalTestGroup) && it.enabled })
}
task run_external () {
// TODO Consider test output directory cleaning before execution.
// TODO Consider using some logger instead of println
// Create tasks for external tests
externalTestsDir.eachDirRecurse {
// Skip build directory and directories without *.kt files.
if (it.name == "build" || it.listFiles().count {it.name.endsWith(".kt")} == 0) {
return
}
def taskDirectory = project.relativePath(it)
def taskName = taskDirectory.replaceAll("[-/]", '_')
task("$taskName", type: RunExternalTestGroup){
groupDirectory = "$taskDirectory"
}
}
def testTasks = tasks.withType(RunExternalTestGroup).matching { it.enabled }
dependsOn(testTasks)
doLast {
Map<String, Map<String, RunExternalTestGroup.TestResult>> results = [:]
def statistics = new RunExternalTestGroup.Statistics()
testTasks.matching { it.state.executed }.each {
results.put(it.name, it.results)
statistics.add(it.statistics)
}
def output = ["statistics" : statistics, "tests" : results]
def json = JsonOutput.toJson(output)
def reportFile = new File(sourceSets.testOutputExternal.output.getDirs().getSingleFile(), "results.json")
reportFile.write(JsonOutput.prettyPrint(json))
println("DONE.\n\n" +
"TOTAL: $statistics.total\n" +
"PASSED: $statistics.passed\n" +
"FAILED: $statistics.failed\n" +
"SKIPPED: $statistics.skipped")
}
}
task daily() {
dependsOn(run_external)
}
task sum (type:RunKonanTest) {
@@ -127,7 +99,6 @@ task fields1(type: RunKonanTest) {
}
task fields2(type: RunKonanTest) {
disabled = true
goldValue =
"Set global = 1\n" +
"Set member = 42\n" +
@@ -166,6 +137,11 @@ task safe_cast(type: RunKonanTest) {
source = "codegen/basics/safe_cast.kt"
}
task typealias1(type: RunKonanTest) {
goldValue = "42\n"
source = "codegen/basics/typealias1.kt"
}
task aritmetic(type: RunKonanTest) {
source = "codegen/function/arithmetic.kt"
}
@@ -202,13 +178,11 @@ task defaults4(type: RunKonanTest) {
}
task defaults5(type: RunKonanTest) {
disabled = true
goldValue = "5\n6\n"
source = "codegen/function/defaults5.kt"
}
task defaults6(type: RunKonanTest) {
disabled = true
goldValue = "42\n"
source = "codegen/function/defaults6.kt"
}
@@ -231,6 +205,27 @@ task cast_simple(type: RunKonanTest) {
source = "codegen/basics/cast_simple.kt"
}
task cast_null(type: RunKonanTest) {
goldValue = "Ok\n"
source = "codegen/basics/cast_null.kt"
}
task unchecked_cast1(type: RunKonanTest) {
goldValue = "17\n17\n42\n42\n"
source = "codegen/basics/unchecked_cast1.kt"
}
task unchecked_cast2(type: RunKonanTest) {
disabled = true
goldValue = "Ok\n"
source = "codegen/basics/unchecked_cast2.kt"
}
task unchecked_cast3(type: RunKonanTest) {
goldValue = "Ok\n"
source = "codegen/basics/unchecked_cast3.kt"
}
task null_check(type: RunKonanTest) {
source = "codegen/basics/null_check.kt"
}
@@ -297,6 +292,76 @@ task empty_substring(type: RunKonanTest) {
source = "runtime/basic/empty_substring.kt"
}
task superFunCall(type: RunKonanTest) {
goldValue = "<fun:C><fun:C1>\n<fun:C><fun:C3>\n"
source = "codegen/basics/superFunCall.kt"
}
task superGetterCall(type: RunKonanTest) {
goldValue = "<prop:C><prop:C1>\n<prop:C><prop:C3>\n"
source = "codegen/basics/superGetterCall.kt"
}
task superSetterCall(type: RunKonanTest) {
goldValue = "<prop:C1><prop:C>zzz\n<prop:C3><prop:C>zzz\n"
source = "codegen/basics/superSetterCall.kt"
}
task enum0(type: RunKonanTest) {
goldValue = "VALUE\n"
source = "codegen/enum/test0.kt"
}
task enum1(type: RunKonanTest) {
goldValue = "z12\n"
source = "codegen/enum/test1.kt"
}
task enum_valueOf(type: RunKonanTest) {
goldValue = "E1\n"
source = "codegen/enum/valueOf.kt"
}
task enum_values(type: RunKonanTest) {
goldValue = "E2\n"
source = "codegen/enum/values.kt"
}
task enum_vCallNoEntryClass(type: RunKonanTest) {
goldValue = "('z3', 3)\n"
source = "codegen/enum/vCallNoEntryClass.kt"
}
task enum_vCallWithEntryClass(type: RunKonanTest) {
goldValue = "z1z2\n"
source = "codegen/enum/vCallWithEntryClass.kt"
}
task enum_companionObject(type: RunKonanTest) {
goldValue = "OK\n"
source = "codegen/enum/companionObject.kt"
}
task innerClass_simple(type: RunKonanTest) {
goldValue = "OK\n"
source = "codegen/innerClass/simple.kt"
}
task innerClass_getOuterVal(type: RunKonanTest) {
goldValue = "OK\n"
source = "codegen/innerClass/getOuterVal.kt"
}
task innerClass_generic(type: RunKonanTest) {
goldValue = "OK\n"
source = "codegen/innerClass/generic.kt"
}
task innerClass_qualifiedThis(type: RunKonanTest) {
goldValue = "OK\n"
source = "codegen/innerClass/qualifiedThis.kt"
}
task array0(type: RunKonanTest) {
goldValue = "5\n6\n7\n8\n9\n10\n11\n12\n13\n"
source = "runtime/collections/array0.kt"
@@ -337,6 +402,11 @@ task when8(type: RunKonanTest) {
goldValue = "true\n"
}
task when9(type: RunKonanTest) {
goldValue = "Ok\n"
source = "codegen/branching/when9.kt"
}
task when_through(type: RunKonanTest) {
source = "codegen/branching/when_through.kt"
}
@@ -505,6 +575,17 @@ task boxing13(type: RunKonanTest) {
source = "codegen/boxing/boxing13.kt"
}
task boxing14(type: RunKonanTest) {
goldValue = "42\n"
source = "codegen/boxing/boxing14.kt"
}
task boxing15(type: RunKonanTest) {
disabled = true
goldValue = "17\n"
source = "codegen/boxing/boxing15.kt"
}
task interface0(type: RunKonanTest) {
goldValue = "PASSED\n"
source = "runtime/basic/interface0.kt"
@@ -572,6 +653,11 @@ task catch7(type: RunKonanTest) {
source = "runtime/exceptions/catch7.kt"
}
task extend_exception(type: RunKonanTest) {
goldValue = "OK\n"
source = "runtime/exceptions/extend0.kt"
}
task catch3(type: RunKonanTest) {
goldValue = "Before\nCaught Throwable\nDone\n"
source = "codegen/try/catch3.kt"
@@ -814,6 +900,21 @@ task lambda13(type: RunKonanTest) {
source = "codegen/lambda/lambda13.kt"
}
task objectExpression1(type: RunKonanTest) {
goldValue = "aabb\n"
source = "codegen/objectExpression/1.kt"
}
task objectExpression2(type: RunKonanTest) {
goldValue = "a\n"
source = "codegen/objectExpression/2.kt"
}
task objectExpression3(type: RunKonanTest) {
goldValue = "\n1\n2\n"
source = "codegen/objectExpression/3.kt"
}
task initializers2(type: RunKonanTest) {
goldValue = "init globalValue2\n" +
"init globalValue3\n" +
@@ -829,11 +930,15 @@ task initializers3(type: RunKonanTest) {
}
task initializers4(type: RunKonanTest) {
disabled = true
goldValue = "fixme\n"
goldValue = "1073741824\ntrue\n"
source = "runtime/basic/initializers4.kt"
}
task initializers5(type: RunKonanTest) {
goldValue = "42\n"
source = "runtime/basic/initializers5.kt"
}
task expression_as_statement(type: RunKonanTest) {
goldValue = "Ok\n"
source = "codegen/basics/expression_as_statement.kt"
@@ -905,6 +1010,7 @@ task inline3(type: RunKonanTest) {
source = "codegen/inline/inline3.kt"
}
<<<<<<< HEAD
task inline4(type: RunKonanTest) {
goldValue = "3\n"
source = "codegen/inline/inline4.kt"
@@ -918,4 +1024,8 @@ task inline5(type: RunKonanTest) {
task inline9(type: RunKonanTest) {
goldValue = "hello\n6\n"
source = "codegen/inline/inline9.kt"
=======
task vararg0(type: RunKonanTest) {
source = "lower/vararg.kt"
>>>>>>> b4ee0e86d2890b3aca7eab4e1910a90fedff2b55
}
@@ -0,0 +1,48 @@
fun main(args: Array<String>) {
testCast(null, false)
testCastToNullable(null, true)
testCastToNullable(Test(), true)
testCastToNullable("", false)
testCastNotNullableToNullable(Test(), true)
testCastNotNullableToNullable("", false)
println("Ok")
}
class Test
fun ensure(b: Boolean) {
if (!b) {
println("Error")
}
}
fun testCast(x: Any?, expectSuccess: Boolean) {
try {
x as Test
} catch (e: Throwable) {
ensure(!expectSuccess)
return
}
ensure(expectSuccess)
}
fun testCastToNullable(x: Any?, expectSuccess: Boolean) {
try {
x as Test?
} catch (e: Throwable) {
ensure(!expectSuccess)
return
}
ensure(expectSuccess)
}
fun testCastNotNullableToNullable(x: Any, expectSuccess: Boolean) {
try {
x as Test?
} catch (e: Throwable) {
ensure(!expectSuccess)
return
}
ensure(expectSuccess)
}
@@ -0,0 +1,19 @@
open class C {
open fun f() = "<fun:C>"
}
class C1: C() {
override fun f() = super<C>.f() + "<fun:C1>"
}
open class C2: C() {
}
class C3: C2() {
override fun f() = super<C2>.f() + "<fun:C3>"
}
fun main(args: Array<String>) {
println(C1().f())
println(C3().f())
}
@@ -0,0 +1,19 @@
open class C {
open val p1 = "<prop:C>"
}
class C1: C() {
override val p1 = super<C>.p1 + "<prop:C1>"
}
open class C2: C() {
}
class C3: C2() {
override val p1 = super<C2>.p1 + "<prop:C3>"
}
fun main(args: Array<String>) {
println(C1().p1)
println(C3().p1)
}
@@ -0,0 +1,32 @@
open class C {
open var p2 = "<prop:C>"
set(value) { field = "<prop:C>" + value }
}
class C1: C() {
override var p2 = super<C>.p2 + "<prop:C1>"
set(value) {
super<C>.p2 = value
field = "<prop:C1>" + super<C>.p2
}
}
open class C2: C() {
}
class C3: C2() {
override var p2 = super<C2>.p2 + "<prop:C3>"
set(value) {
super<C2>.p2 = value
field = "<prop:C3>" + super<C2>.p2
}
}
fun main(args: Array<String>) {
val c1 = C1()
val c3 = C3()
c1.p2 = "zzz"
c3.p2 = "zzz"
println(c1.p2)
println(c3.p2)
}
@@ -0,0 +1,6 @@
fun main(args: Array<String>) {
println(Bar(42).x)
}
class Foo(val x: Int)
typealias Bar = Foo
@@ -0,0 +1,16 @@
fun main(args: Array<String>) {
foo<String>("17")
bar<String>("17")
foo<String>(42)
bar<String>(42)
}
fun <T> foo(x: Any?) {
val y = x as T
println(y.toString())
}
fun <T> bar(x: Any?) {
val y = x as? T
println(y.toString())
}
@@ -0,0 +1,10 @@
fun main(args: Array<String>) {
try {
val x = cast<String>(Any())
println(x.length)
} catch (e: Throwable) {
println("Ok")
}
}
fun <T> cast(x: Any?) = x as T
@@ -0,0 +1,35 @@
fun main(args: Array<String>) {
testCast<Test>(Test(), true)
testCast<Test>(null, false)
testCastToNullable<Test>(null, true)
println("Ok")
}
class Test
fun ensure(b: Boolean) {
if (!b) {
println("Error")
}
}
fun <T : Any> testCast(x: Any?, expectSuccess: Boolean) {
try {
x as T
} catch (e: Throwable) {
ensure(!expectSuccess)
return
}
ensure(expectSuccess)
}
fun <T : Any> testCastToNullable(x: Any?, expectSuccess: Boolean) {
try {
x as T?
} catch (e: Throwable) {
ensure(!expectSuccess)
return
}
ensure(expectSuccess)
}
@@ -0,0 +1,5 @@
fun main(args: Array<String>) {
42.println()
}
fun <T> T.println() = println(this.toString())
@@ -0,0 +1,5 @@
fun main(args: Array<String>) {
println(foo(17))
}
fun <T : Int> foo(x: T): Int = x
@@ -0,0 +1,10 @@
fun main(args: Array<String>) {
foo(0)
println("Ok")
}
fun foo(x: Int) {
when (x) {
0 -> 0
}
}
@@ -0,0 +1,24 @@
enum class Game {
ROCK,
PAPER,
SCISSORS;
companion object {
fun foo() = ROCK
val bar = PAPER
val values2 = values()
val scissors = valueOf("SCISSORS")
}
}
fun box(): String {
if (Game.foo() != Game.ROCK) return "Fail 1"
if (Game.bar != Game.PAPER) return "Fail 2: ${Game.bar}"
if (Game.values().size != 3) return "Fail 3"
if (Game.valueOf("SCISSORS") != Game.SCISSORS) return "Fail 4"
if (Game.values2.size != 3) return "Fail 5"
if (Game.scissors != Game.SCISSORS) return "Fail 6"
return "OK"
}
fun main(args: Array<String>) = println(box())
@@ -0,0 +1,9 @@
val TOP_LEVEL = 5
enum class MyEnum(value: Int) {
VALUE(TOP_LEVEL)
}
fun main(args: Array<String>) {
println(MyEnum.VALUE.toString())
}
@@ -0,0 +1,8 @@
enum class Zzz(val zzz: String, val x: Int) {
Z1("z1", 1),
Z2("z2", 2)
}
fun main(args: Array<String>) {
println(Zzz.Z1.zzz + Zzz.Z2.x)
}
@@ -0,0 +1,13 @@
enum class Zzz(val zzz: String, val x: Int) {
Z1("z1", 1),
Z2("z2", 2),
Z3("z3", 3);
override fun toString(): String{
return "('$zzz', $x)"
}
}
fun main(args: Array<String>) {
println(Zzz.Z3.toString())
}
@@ -0,0 +1,15 @@
enum class Zzz {
Z1 {
override fun f() = "z1"
},
Z2 {
override fun f() = "z2"
};
open fun f() = ""
}
fun main(args: Array<String>) {
println(Zzz.Z1.f() + Zzz.Z2.f())
}
@@ -0,0 +1,8 @@
enum class E {
E1,
E2
}
fun main(args: Array<String>) {
println(E.valueOf("E1").toString())
}
@@ -0,0 +1,8 @@
enum class E {
E1,
E2
}
fun main(args: Array<String>) {
println(E.values()[1].toString())
}
@@ -2,10 +2,12 @@ open class A {
open fun foo(x: Int = 42) = println(x)
}
class B : A() {
open class B : A()
class C : B() {
override fun foo(x: Int) = println(x + 1)
}
fun main(args: Array<String>) {
B().foo()
C().foo()
}
@@ -0,0 +1,15 @@
class Outer {
inner class Inner<T>(val t: T) {
fun box() = t
}
}
fun box(): String {
if (Outer().Inner("OK").box() != "OK") return "Fail"
val x: Outer.Inner<String> = Outer().Inner("OK")
return x.box()
}
fun main(args: Array<String>) {
println(box())
}
@@ -0,0 +1,12 @@
class Outer(val s: String) {
inner class Inner {
fun box() = s
}
}
fun box() = Outer("OK").Inner().box()
fun main(args: Array<String>)
{
println(box())
}
@@ -0,0 +1,46 @@
open class ABase
{
open fun zzz() = "a_base"
}
open class BBase
{
open fun zzz() = "b_base"
}
class D() {
val z = "d"
}
class A: ABase() { // implicit label @A
val z = "a"
override fun zzz() = "a"
inner class B: BBase() { // implicit label @B
val z = "b"
override fun zzz() = "b"
fun D.foo() : String { // implicit label @foo
if(this@A.z != "a") return "Fail1"
if(this@B.z != "b") return "Fail2"
if(super@A.zzz() != "a_base") return "Fail3"
if(super<BBase>.zzz() != "b_base") return "Fail4"
if(super@B.zzz() != "b_base") return "Fail5"
if(this@A.zzz() != "a") return "Fail6"
if(this@B.zzz() != "b") return "Fail7"
if(this.z != "d") return "Fail8"
return "OK"
}
fun bar(d: D): String {
return d.foo()
}
}
}
fun box() = A().B().bar(D())
fun main(args : Array<String>) {
println(box())
}
@@ -0,0 +1,12 @@
class Outer {
inner class Inner {
fun box() = "OK"
}
}
fun box() = Outer().Inner().box()
fun main(args: Array<String>)
{
println(box())
}
@@ -0,0 +1,13 @@
fun main(args: Array<String>) {
val a = "a"
val x = object {
override fun toString(): String {
return foo(a) + foo("b")
}
fun foo(s: String) = s + s
}
println(x.toString())
}
@@ -0,0 +1,17 @@
fun main(args: Array<String>) {
val a = "a"
val x = object {
override fun toString(): String {
return foo {
a
}
}
fun foo(lambda: () -> String) = lambda()
}
print(x)
}
fun print(x: Any) = println(x.toString())
@@ -0,0 +1,17 @@
fun main(args: Array<String>) {
var cnt = 0
var x: Any = ""
for (i in 0 .. 1) {
print(x)
cnt++
val y = object {
override fun toString() = cnt.toString()
}
x = y
}
print(x)
}
fun print(x: Any) = println(x.toString())
@@ -0,0 +1,35 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
// KT-5665
@Retention(AnnotationRetention.RUNTIME)
annotation class First
@Retention(AnnotationRetention.RUNTIME)
annotation class Second(val value: String)
enum class E {
@First
E1 {
fun foo() = "something"
},
@Second("OK")
E2
}
fun box(): String {
val e = E::class.java
val e1 = e.getDeclaredField(E.E1.toString()).getAnnotations()
if (e1.size != 1) return "Fail E1 size: ${e1.toList()}"
if (e1[0].annotationClass.java != First::class.java) return "Fail E1: ${e1.toList()}"
val e2 = e.getDeclaredField(E.E2.toString()).getAnnotations()
if (e2.size != 1) return "Fail E2 size: ${e2.toList()}"
if (e2[0].annotationClass.java != Second::class.java) return "Fail E2: ${e2.toList()}"
return (e2[0] as Second).value
}
@@ -0,0 +1,33 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
import java.lang.reflect.Method
import kotlin.test.assertEquals
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(val x: String)
fun foo0(block: () -> Unit) = block.javaClass
fun foo1(block: (String) -> Unit) = block.javaClass
fun testMethod(method: Method, name: String) {
assertEquals("OK", method.getAnnotation(Ann::class.java).x, "On method of test named `$name`")
for ((index, annotations) in method.getParameterAnnotations().withIndex()) {
val ann = annotations.filterIsInstance<Ann>().single()
assertEquals("OK$index", ann.x, "On parameter $index of test named `$name`")
}
}
fun testClass(clazz: Class<*>, name: String) {
val invokes = clazz.getDeclaredMethods().single() { !it.isBridge() }
testMethod(invokes, name)
}
fun box(): String {
testClass(foo0( @Ann("OK") fun() {} ), "1")
testClass(foo1( @Ann("OK") fun(@Ann("OK0") x: String) {} ), "2")
return "OK"
}
@@ -0,0 +1,35 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
import java.lang.reflect.Method
import kotlin.test.assertEquals
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(val x: String)
fun foo0(block: () -> Unit) = block.javaClass
fun testMethod(method: Method, name: String) {
assertEquals("OK", method.getAnnotation(Ann::class.java).x, "On method of test named `$name`")
for ((index, annotations) in method.getParameterAnnotations().withIndex()) {
val ann = annotations.filterIsInstance<Ann>().single()
assertEquals("OK$index", ann.x, "On parameter $index of test named `$name`")
}
}
fun testClass(clazz: Class<*>, name: String) {
val invokes = clazz.getDeclaredMethods().single() { !it.isBridge() }
testMethod(invokes, name)
}
fun box(): String {
testClass(foo0(@Ann("OK") { }), "1")
testClass(foo0( @Ann("OK") { }), "2")
testClass(foo0() @Ann("OK") { }, "3")
return "OK"
}
@@ -0,0 +1,49 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
// FILE: Test.java
class Test {
public static Class<?> apply(Runnable x) {
return x.getClass();
}
public static interface ABC {
void apply(String x1, String x2);
}
public static Class<?> applyABC(ABC x) {
return x.getClass();
}
}
// FILE: test.kt
import java.lang.reflect.Method
import kotlin.test.assertEquals
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(val x: String)
fun testMethod(method: Method, name: String) {
assertEquals("OK", method.getAnnotation(Ann::class.java).x, "On method of test named `$name`")
for ((index, annotations) in method.getParameterAnnotations().withIndex()) {
val ann = annotations.filterIsInstance<Ann>().single()
assertEquals("OK$index", ann.x, "On parameter $index of test named `$name`")
}
}
fun testClass(clazz: Class<*>, name: String) {
val invokes = clazz.getDeclaredMethods().single() { !it.isBridge() }
testMethod(invokes, name)
}
fun box(): String {
testClass(Test.apply(@Ann("OK") fun(){}), "1")
testClass(Test.applyABC(@Ann("OK") fun(@Ann("OK0") x: String, @Ann("OK1") y: String){}), "2")
return "OK"
}
@@ -0,0 +1,40 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
// FILE: Test.java
class Test {
public static Class<?> apply(Runnable x) {
return x.getClass();
}
}
// FILE: test.kt
import java.lang.reflect.Method
import kotlin.test.assertEquals
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(val x: String)
fun testMethod(method: Method, name: String) {
assertEquals("OK", method.getAnnotation(Ann::class.java).x, "On method of test named `$name`")
for ((index, annotations) in method.getParameterAnnotations().withIndex()) {
val ann = annotations.filterIsInstance<Ann>().single()
assertEquals("OK$index", ann.x, "On parameter $index of test named `$name`")
}
}
fun testClass(clazz: Class<*>, name: String) {
val invokes = clazz.getDeclaredMethods().single() { !it.isBridge() }
testMethod(invokes, name)
}
fun box(): String {
testClass(Test.apply(@Ann("OK") {}), "1")
testClass(Test.apply @Ann("OK") {}, "2")
return "OK"
}
@@ -0,0 +1,19 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
annotation class Ann(val v: String = "???")
@Ann open class My
fun box(): String {
val v = @Ann("OK") object: My() {}
val klass = v.javaClass
val annotations = klass.annotations.toList()
// Ann, kotlin.Metadata
if (annotations.size != 2) return "Fail annotations size is ${annotations.size}: $annotations"
val annotation = annotations.filterIsInstance<Ann>().firstOrNull()
?: return "Fail no @Ann: $annotations"
return annotation.v
}
@@ -0,0 +1,36 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
// FILE: JavaClass.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
public class JavaClass {
@Retention(RetentionPolicy.RUNTIME)
@interface Foo {
int value();
}
@Foo(KotlinClass.FOO_INT)
public String test() throws NoSuchMethodException {
return KotlinClass.FOO_STRING +
JavaClass.class.getMethod("test").getAnnotation(Foo.class).value();
}
}
// FILE: kotlinClass.kt
class KotlinClass {
companion object {
const val FOO_INT: Int = 10
@JvmField val FOO_STRING: String = "OK"
}
}
fun box(): String {
val test = JavaClass().test()
return if (test == "OK10") "OK" else "fail : $test"
}
@@ -0,0 +1,35 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// FILE: JavaClass.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
public class JavaClass {
@Retention(RetentionPolicy.RUNTIME)
@interface Foo {
int value();
}
@Foo(KotlinInterface.FOO_INT)
public String test() throws NoSuchMethodException {
return KotlinInterface.FOO_STRING +
JavaClass.class.getMethod("test").getAnnotation(Foo.class).value();
}
}
// FILE: KotlinInterface.kt
interface KotlinInterface {
companion object {
const val FOO_INT: Int = 10
const val FOO_STRING: String = "OK"
}
}
fun box(): String {
val test = JavaClass().test()
return if (test == "OK10") "OK" else "fail : $test"
}
@@ -0,0 +1,40 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
import kotlin.test.assertEquals
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(val x: Int)
class A {
@Ann(1) fun foo(x: Int, y: Int = 2, z: Int) {}
@Ann(1) constructor(x: Int, y: Int = 2, z: Int)
}
class B @Ann(1) constructor(x: Int, y: Int = 2, z: Int) {}
fun test(name: String, annotations: Array<out Annotation>) {
assertEquals(1, annotations.filterIsInstance<Ann>().single().x, "$name[0]")
}
fun box(): String {
val foo = A::class.java.getDeclaredMethods().first { it.getName() == "foo" }
test("foo", foo.getDeclaredAnnotations())
val fooDefault = A::class.java.getDeclaredMethods().first { it.getName() == "foo\$default" }
test("foo", foo.getDeclaredAnnotations())
val (secondary, secondaryDefault) = A::class.java.getDeclaredConstructors().partition { it.getParameterTypes().size == 3 }
test("secondary", secondary[0].getDeclaredAnnotations())
test("secondary\$default", secondaryDefault[0].getDeclaredAnnotations())
val (primary, primaryDefault) = B::class.java.getConstructors().partition { it.getParameterTypes().size == 3 }
test("primary", primary[0].getDeclaredAnnotations())
test("primary\$default", primaryDefault[0].getDeclaredAnnotations())
return "OK"
}
@@ -0,0 +1,28 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
// FULL_JDK
import kotlin.annotation.AnnotationTarget.*
import kotlin.annotation.AnnotationRetention.*
import java.lang.Class
@Target(TYPEALIAS)
@Retention(RUNTIME)
annotation class Ann(val x: Int)
@Ann(2)
typealias TA = Any
fun Class<*>.assertHasDeclaredMethodWithAnn() {
if (!declaredMethods.any { it.isSynthetic && it.getAnnotation(Ann::class.java) != null }) {
throw java.lang.AssertionError("Class ${this.simpleName} has no declared method with annotation @Ann")
}
}
fun box(): String {
Class.forName("AnnotationsOnTypeAliasesKt").assertHasDeclaredMethodWithAnn()
return "OK"
}
@@ -0,0 +1,41 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
import kotlin.reflect.KClass
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(
val i: Int = 1,
val s: String = "a",
val a: Ann2 = Ann2(),
val e: MyEnum = MyEnum.A,
val c: KClass<*> = A::class,
val ia: IntArray = intArrayOf(1, 2),
val sa: Array<String> = arrayOf("a", "b")
)
fun box(): String {
val ann = MyClass::class.java.getAnnotation(Ann::class.java)
if (ann == null) return "fail: cannot find Ann on MyClass}"
if (ann.i != 1) return "fail: annotation parameter i should be 1, but was ${ann.i}"
if (ann.s != "a") return "fail: annotation parameter s should be \"a\", but was ${ann.s}"
val annSimpleName = ann.a.annotationClass.java.getSimpleName()
if (annSimpleName != "Ann2") return "fail: annotation parameter a should be of class Ann2, but was $annSimpleName"
if (ann.e != MyEnum.A) return "fail: annotation parameter e should be MyEnum.A, but was ${ann.e}"
if (ann.c.java != A::class.java) return "fail: annotation parameter c should be of class A, but was ${ann.c}"
if (ann.ia[0] != 1 || ann.ia[1] != 2) return "fail: annotation parameter ia should be [1, 2], but was ${ann.ia}"
if (ann.sa[0] != "a" || ann.sa[1] != "b") return "fail: annotation parameter ia should be [\"a\", \"b\"], but was ${ann.sa}"
return "OK"
}
annotation class Ann2
enum class MyEnum {
A
}
class A
@Ann class MyClass
@@ -0,0 +1,32 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
import kotlin.reflect.KProperty
@Retention(AnnotationRetention.RUNTIME)
annotation class First
class MyClass() {
public var x: String by Delegate()
@First set
}
class Delegate {
operator fun getValue(t: Any?, p: KProperty<*>): String {
return "OK"
}
operator fun setValue(t: Any?, p: KProperty<*>, i: String) {}
}
fun box(): String {
val e = MyClass::class.java
val e1 = e.getDeclaredMethod("setX", String::class.java).getAnnotations()
if (e1.size != 1) return "Fail E1 size: ${e1.toList()}"
if (e1[0].annotationClass.java != First::class.java) return "Fail: ${e1.toList()}"
return MyClass().x
}
@@ -0,0 +1,14 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
@file:StringHolder("OK")
@file:JvmName("FileClass")
@Target(AnnotationTarget.FILE)
@Retention(AnnotationRetention.RUNTIME)
public annotation class StringHolder(val value: String)
fun box(): String =
Class.forName("FileClass").getAnnotation(StringHolder::class.java)?.value ?: "null"
@@ -0,0 +1,34 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
// FULL_JDK
import java.lang.reflect.Modifier
import kotlin.reflect.KProperty
class CustomDelegate {
operator fun getValue(thisRef: Any?, prop: KProperty<*>): String = prop.name
}
class C {
@Volatile var vol = 1
@Transient val tra = 1
@delegate:Transient val del: String by CustomDelegate()
@Strictfp fun str() {}
@Synchronized fun sync() {}
}
fun box(): String {
val c = C::class.java
if (c.getDeclaredField("vol").getModifiers() and Modifier.VOLATILE == 0) return "Fail: volatile"
if (c.getDeclaredField("tra").getModifiers() and Modifier.TRANSIENT == 0) return "Fail: transient"
if (c.getDeclaredField("del\$delegate").getModifiers() and Modifier.TRANSIENT == 0) return "Fail: delegate transient"
if (c.getDeclaredMethod("str").getModifiers() and Modifier.STRICT == 0) return "Fail: strict"
if (c.getDeclaredMethod("sync").getModifiers() and Modifier.SYNCHRONIZED == 0) return "Fail: synchronized"
return "OK"
}
@@ -0,0 +1,48 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
@Ann(Foo.i, Foo.s, Foo.f, Foo.d, Foo.l, Foo.b, Foo.bool, Foo.c, Foo.str) class MyClass
fun box(): String {
val ann = MyClass::class.java.getAnnotation(Ann::class.java)
if (ann == null) return "fail: cannot find Ann on MyClass}"
if (ann.i != 2) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.s != 2.toShort()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.f != 2.toFloat()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.d != 2.toDouble()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.l != 2.toLong()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.b != 2.toByte()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (!ann.bool) return "fail: annotation parameter i should be true, but was ${ann.i}"
if (ann.c != 'c') return "fail: annotation parameter i should be c, but was ${ann.i}"
if (ann.str != "str") return "fail: annotation parameter i should be str, but was ${ann.i}"
return "OK"
}
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(
val i: Int,
val s: Short,
val f: Float,
val d: Double,
val l: Long,
val b: Byte,
val bool: Boolean,
val c: Char,
val str: String
)
class Foo {
companion object {
const val i: Int = 2
const val s: Short = 2
const val f: Float = 2.0.toFloat()
const val d: Double = 2.0
const val l: Long = 2
const val b: Byte = 2
const val bool: Boolean = true
const val c: Char = 'c'
const val str: String = "str"
}
}
@@ -0,0 +1,44 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
@Ann(i, s, f, d, l, b, bool, c, str) class MyClass
fun box(): String {
val ann = MyClass::class.java.getAnnotation(Ann::class.java)
if (ann == null) return "fail: cannot find Ann on MyClass}"
if (ann.i != 2) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.s != 2.toShort()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.f != 2.toFloat()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.d != 2.toDouble()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.l != 2.toLong()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.b != 2.toByte()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (!ann.bool) return "fail: annotation parameter i should be true, but was ${ann.i}"
if (ann.c != 'c') return "fail: annotation parameter i should be c, but was ${ann.i}"
if (ann.str != "str") return "fail: annotation parameter i should be str, but was ${ann.i}"
return "OK"
}
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(
val i: Int,
val s: Short,
val f: Float,
val d: Double,
val l: Long,
val b: Byte,
val bool: Boolean,
val c: Char,
val str: String
)
const val i: Int = 2
const val s: Short = 2
const val f: Float = 2.0.toFloat()
const val d: Double = 2.0
const val l: Long = 2
const val b: Byte = 2
const val bool: Boolean = true
const val c: Char = 'c'
const val str: String = "str"
@@ -0,0 +1,24 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
annotation class A
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class B(val items: Array<A> = arrayOf(A()))
@B
class C
fun box(): String {
val bClass = B::class.java
val cClass = C::class.java
val items = cClass.getAnnotation(bClass).items
assert(items.size == 1) { "Expected: [A()], got ${items.asList()}" }
assert(items[0] is A) { "Expected: [A()], got ${items.asList()}" }
return "OK"
}
@@ -0,0 +1,24 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
@Ann(A.B.i) class MyClass
fun box(): String {
val ann = MyClass::class.java.getAnnotation(Ann::class.java)
if (ann == null) return "fail: cannot find Ann on MyClass}"
if (ann.i != 1) return "fail: annotation parameter i should be 1, but was ${ann.i}"
return "OK"
}
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(val i: Int)
class A {
class B {
companion object {
const val i = 1
}
}
}
@@ -0,0 +1,32 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(
val b: Byte,
val s: Short,
val i: Int,
val f: Float,
val d: Double,
val l: Long,
val c: Char,
val bool: Boolean
)
fun box(): String {
val ann = MyClass::class.java.getAnnotation(Ann::class.java)
if (ann == null) return "fail: cannot find Ann on MyClass}"
if (ann.b != 1.toByte()) return "fail: annotation parameter b should be 1, but was ${ann.b}"
if (ann.s != 1.toShort()) return "fail: annotation parameter s should be 1, but was ${ann.s}"
if (ann.i != 1) return "fail: annotation parameter i should be 1, but was ${ann.i}"
if (ann.f != 1.toFloat()) return "fail: annotation parameter f should be 1, but was ${ann.f}"
if (ann.d != 1.0) return "fail: annotation parameter d should be 1, but was ${ann.d}"
if (ann.l != 1.toLong()) return "fail: annotation parameter l should be 1, but was ${ann.l}"
if (ann.c != 'c') return "fail: annotation parameter c should be 1, but was ${ann.c}"
if (!ann.bool) return "fail: annotation parameter bool should be 1, but was ${ann.bool}"
return "OK"
}
@Ann(1, 1, 1, 1.0.toFloat(), 1.0, 1, 'c', true) class MyClass
@@ -0,0 +1,19 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
@Ann(i) class MyClass
fun box(): String {
val ann = MyClass::class.java.getAnnotation(Ann::class.java)
if (ann == null) return "fail: cannot find Ann on MyClass}"
if (ann.i != 1) return "fail: annotation parameter i should be 1, but was ${ann.i}"
return "OK"
}
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(val i: Int)
const val i2: Int = 1
const val i: Int = i2
@@ -0,0 +1,19 @@
// WITH_RUNTIME
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
@kotlin.internal.LowPriorityInOverloadResolution
fun foo(i: Int) = 1
fun foo(a: Any) = 2
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
@kotlin.internal.LowPriorityInOverloadResolution
fun bar(a: String?) = 3
fun bar(a: Any) = 4
fun box(): String {
if (foo(1) != 2) return "fail1"
if (bar(null) != 3) return "fail2"
return "OK"
}
@@ -0,0 +1,53 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(vararg val p: Int)
@Ann() class MyClass1
@Ann(1) class MyClass2
@Ann(1, 2) class MyClass3
@Ann(*intArrayOf()) class MyClass4
@Ann(*intArrayOf(1)) class MyClass5
@Ann(*intArrayOf(1, 2)) class MyClass6
@Ann(p = 1) class MyClass7
@Ann(p = *intArrayOf()) class MyClass8
@Ann(p = *intArrayOf(1)) class MyClass9
@Ann(p = *intArrayOf(1, 2)) class MyClass10
fun box(): String {
test(MyClass1::class.java, "")
test(MyClass2::class.java, "1")
test(MyClass3::class.java, "12")
test(MyClass4::class.java, "")
test(MyClass5::class.java, "1")
test(MyClass6::class.java, "12")
test(MyClass7::class.java, "1")
test(MyClass8::class.java, "")
test(MyClass9::class.java, "1")
test(MyClass10::class.java, "12")
return "OK"
}
fun test(klass: Class<*>, expected: String) {
val ann = klass.getAnnotation(Ann::class.java)
if (ann == null) throw AssertionError("fail: cannot find Ann on ${klass}")
var result = ""
for (i in ann.p) {
result += i
}
if (result != expected) {
throw AssertionError("fail: expected = ${expected}, actual = ${result}")
}
}
@@ -0,0 +1,16 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
fun test(a: String, b: String): String {
return a + b;
}
fun box(): String {
var res = "";
val call = test(b = {res += "K"; "K"}(), a = {res+="O"; "O"}())
if (res != "KO" || call != "OK") return "fail: $res != KO or $call != OK"
return "OK"
}
@@ -0,0 +1,34 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
fun box(): String {
var invokeOrder = "";
val expectedResult = "0_1_9"
val expectedInvokeOrder = "1_0_9"
var l = 1L
var i = 0
val captured = 9L
var result = test(b = {invokeOrder += "1_"; l}(), a = {invokeOrder+="0_"; i}(), c = {invokeOrder += "$captured"; "$captured"})
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 1: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = test(b = {invokeOrder += "1_"; l}(), c = {invokeOrder += "$captured"; "$captured"}, a = {invokeOrder+="0_"; i}())
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 2: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = test(c = {invokeOrder += "$captured"; "$captured"}, b = {invokeOrder += "1_"; l}(), a = {invokeOrder+="0_"; i}())
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 3: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = test(a = {invokeOrder+="0_"; i}(), c = {invokeOrder += "$captured"; "$captured"}, b = {invokeOrder += "1_"; l}())
if (invokeOrder != "0_1_9" || result != expectedResult) return "fail 4: $invokeOrder != 0_1_9 or $result != $expectedResult"
return "OK"
}
fun test(a: Int, b: Long, c: () -> String): String {
return { "${a}_${b}_${c()}"} ()
}
@@ -0,0 +1,33 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
fun box(): String {
var invokeOrder = "";
val expectedResult = "1.0_0_1_9"
val expectedInvokeOrder = "1_0_9"
var l = 1L
var i = 0
val captured = 9L
var result = 1.0.test(b = {invokeOrder += "1_"; l}(), a = {invokeOrder+="0_"; i}(), c = {invokeOrder += "$captured"; "$captured"})
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 1: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = 1.0.test(b = {invokeOrder += "1_"; l}(), c = {invokeOrder += "${captured}"; "${captured}"}, a = {invokeOrder+="0_"; i}())
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 2: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = 1.0.test(c = {invokeOrder += "${captured}"; "${captured}"}, b = {invokeOrder += "1_"; l}(), a = {invokeOrder+="0_"; i}())
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 3: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = 1.0.test(a = {invokeOrder+="0_"; i}(), c = {invokeOrder += "${captured}"; "${captured}"}, b = {invokeOrder += "1_"; l}())
if (invokeOrder != "0_1_9" || result != expectedResult) return "fail 4: $invokeOrder != 0_1_9 or $result != $expectedResult"
return "OK"
}
fun Double.test(a: Int, b: Long, c: () -> String): String {
return { "${this}_${a}_${b}_${c()}"} ()
}
@@ -0,0 +1,16 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
var invokeOrder: String = ""
fun test(x: Double = { invokeOrder += "x"; 1.0 }(), a: String, y: Long = { invokeOrder += "y"; 1 }(), b: String): String {
return "" + x + a + b + y;
}
fun box(): String {
val funResult = test(b = { invokeOrder += "K"; "K" }(), a = { invokeOrder += "O"; "O" }())
if (invokeOrder != "KOxy" || funResult != "1.0OK1") return "fail: $invokeOrder != KOxy or $funResult != 1.0OK1"
return "OK"
}
@@ -0,0 +1,33 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
fun box(): String {
var invokeOrder = "";
val expectedResult = "1.0_0_1_L"
val expectedInvokeOrder = "1_0_L"
var l = 1L
var i = 0
var result = 1.0.test(b = {invokeOrder += "1_"; l}(), a = {invokeOrder+="0_"; i}(), c = {invokeOrder += "L"; "L"})
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 1: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = 1.0.test(b = {invokeOrder += "1_"; l}(), c = {invokeOrder += "L"; "L"}, a = {invokeOrder+="0_"; i}())
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 2: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = 1.0.test(c = {invokeOrder += "L"; "L"}, b = {invokeOrder += "1_"; l}(), a = {invokeOrder+="0_"; i}())
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 3: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = 1.0.test(a = {invokeOrder+="0_"; i}(), c = {invokeOrder += "L"; "L"}, b = {invokeOrder += "1_"; l}())
if (invokeOrder != "0_1_L" || result != expectedResult) return "fail 4: $invokeOrder != 0_1_L or $result != $expectedResult"
return "OK"
}
fun Double.test(a: Int, b: Long, c: () -> String): String {
return "${this}_${a}_${b}_${c()}"
}
@@ -0,0 +1,40 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
fun box(): String {
return Z().test()
}
class Z {
fun Double.test(a: Int, b: Long, c: () -> String): String {
return "${this}_${a}_${b}_${c()}"
}
fun test(): String {
var invokeOrder = "";
val expectedResult = "1.0_0_1_L"
val expectedInvokeOrder = "1_0_L"
var l = 1L
var i = 0
var result = 1.0.test(b = { invokeOrder += "1_"; l }(), a = { invokeOrder += "0_"; i }(), c = { invokeOrder += "L"; "L" })
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 1: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = 1.0.test(b = { invokeOrder += "1_"; l }(), c = { invokeOrder += "L"; "L" }, a = { invokeOrder += "0_"; i }())
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 2: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = 1.0.test(c = { invokeOrder += "L"; "L" }, b = { invokeOrder += "1_"; l }(), a = { invokeOrder += "0_"; i }())
if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 3: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult"
invokeOrder = "";
result = 1.0.test(a = { invokeOrder += "0_"; i }(), c = { invokeOrder += "L"; "L" }, b = { invokeOrder += "1_"; l }())
if (invokeOrder != "0_1_L" || result != expectedResult) return "fail 4: $invokeOrder != 0_1_L or $result != $expectedResult"
return "OK"
}
}
@@ -0,0 +1,13 @@
// KT-9277 Unexpected NullPointerException in an invocaton with named arguments
fun box(): String {
foo(null)
return "OK"
}
fun foo(x : Int?){
bar(z = x ?: return, y = x)
}
fun bar(y : Int, z : Int) {}
@@ -0,0 +1,21 @@
fun box(): String {
var res = "";
var call = test(a = {res += "K"; "K"}(), b = {res+="O"; "O"}(), c = {res += "L"; "L"})
if (res != "KOL" || call != "KOL") return "fail 1: $res != KOL or $call != KOL"
res = "";
call = test(a = {res += "K"; "K"}(), c = {res += "L"; "L"}, b = {res+="O"; "O"}())
if (res != "KOL" || call != "KOL") return "fail 2: $res != KOL or $call != KOL"
res = "";
call = test(c = {res += "L"; "L"}, a = {res += "K"; "K"}(), b = {res+="O"; "O"}())
if (res != "KOL" || call != "KOL") return "fail 3: $res != KOL or $call != KOL"
return "OK"
}
fun test(a: String, b: String, c: () -> String): String {
return a + b + c();
}
@@ -0,0 +1,25 @@
fun box(): String {
var res = "";
var call = Z("Z").test(a = {res += "K"; "K"}(), b = {res+="O"; "O"}(), c = {res += "L"; "L"})
if (res != "KOL" || call != "KOLZ") return "fail 1: $res != KOL or $call != KOLZ"
res = "";
call = Z("Z").test(a = {res += "K"; "K"}(), c = {res += "L"; "L"}, b = {res+="O"; "O"}())
if (res != "KOL" || call != "KOLZ") return "fail 2: $res != KOL or $call != KOLZ"
res = "";
call = Z("Z").test(c = {res += "L"; "L"}, a = {res += "K"; "K"}(), b = {res+="O"; "O"}())
if (res != "KOL" || call != "KOLZ") return "fail 3: $res != KOL or $call != KOLZ"
return "OK"
}
class Z(val p: String) {
fun test(a: String, b: String, c: () -> String): String {
return a + b + c() + p;
}
}
@@ -0,0 +1,24 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
fun box(): String {
var res = "";
var call = test(b = {res += "K"; "K"}(), a = {res+="O"; "O"}(), c = {res += "L"; "L"})
if (res != "KOL" || call != "OKL") return "fail 1: $res != KOL or $call != OKL"
res = "";
call = test(b = {res += "K"; "K"}(), c = {res += "L"; "L"}, a = {res+="O"; "O"}())
if (res != "KOL" || call != "OKL") return "fail 2: $res != KOL or $call != OKL"
res = "";
call = test(c = {res += "L"; "L"}, b = {res += "K"; "K"}(), a = {res+="O"; "O"}())
if (res != "KOL" || call != "OKL") return "fail 3: $res != KOL or $call != OKL"
return "OK"
}
fun test(a: String, b: String, c: () -> String): String {
return a + b + c();
}
@@ -0,0 +1,26 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
fun box(): String {
var res = "";
var call = Z("Z").test(b = {res += "K"; "K"}(), a = {res+="O"; "O"}(), c = {res += "L"; "L"})
if (res != "KOL" || call != "OKLZ") return "fail 1: $res != KOL or $call != OKLZ"
res = "";
call = Z("Z").test(b = {res += "K"; "K"}(), c = {res += "L"; "L"}, a = {res+="O"; "O"}())
if (res != "KOL" || call != "OKLZ") return "fail 2: $res != KOL or $call != OKLZ"
res = "";
call = Z("Z").test(c = {res += "L"; "L"}, b = {res += "K"; "K"}(), a = {res+="O"; "O"}())
if (res != "KOL" || call != "OKLZ") return "fail 3: $res != KOL or $call != OKLZ"
return "OK"
}
class Z(val p: String) {
fun test(a: String, b: String, c: () -> String): String {
return a + b + c() + p;
}
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun simpleIntArray(): Array<Int> = Array(3) { it }
fun simpleDoubleArray(): Array<Double> = Array(3) { it.toDouble() + 0.1 }
fun simpleStringArray(): Array<String> = Array(3) { it.toString() }
fun box(): String {
val ia = simpleIntArray()
assertEquals(0, ia[0])
assertEquals(1, ia[1])
assertEquals(2, ia[2])
val da = simpleDoubleArray()
assertEquals(0.1, da[0])
assertEquals(1.1, da[1])
assertEquals(2.1, da[2])
val sa = simpleStringArray()
assertEquals("0", sa[0])
assertEquals("1", sa[1])
assertEquals("2", sa[2])
return "OK"
}
@@ -0,0 +1,11 @@
operator fun Array<String>.get(index1: Int, index2: Int) = this[index1 + index2]
operator fun Array<String>.set(index1: Int, index2: Int, elem: String) {
this[index1 + index2] = elem
}
fun box(): String {
val s = Array<String>(1, { "" })
s[1, -1] = "O"
s[2, -2] += "K"
return s[-3, 3]
}
@@ -0,0 +1,11 @@
operator fun Array<String>.get(index1: Int, index2: Int) = this[index1 + index2]
operator fun Array<String>.set(index1: Int, index2: Int, elem: String) {
this[index1 + index2] = elem
}
fun box(): String {
val s = Array<String>(1, { "" })
s[1, -1] = "OK"
return s[-2, 2]
}
@@ -0,0 +1,29 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
//test [], get and iterator calls
fun test(createIntNotLong: Boolean): String {
val a = if (createIntNotLong) IntArray(5) else LongArray(5)
if (a is IntArray) {
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a[i] != x.next()) return "Fail $i"
i++
}
return "O"
} else if (a is LongArray) {
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a.get(i) != x.next()) return "Fail $i"
i++
}
return "K"
}
return "fail"
}
fun box(): String {
return test(true) + test(false)
}
@@ -0,0 +1,6 @@
fun box(): String {
val s = IntArray(1)
s[0] = 5
s[0] += 7
return if (s[0] == 12) "OK" else "Fail ${s[0]}"
}
@@ -0,0 +1,28 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
fun foo(x: Cloneable) = x
fun box(): String {
foo(arrayOf(""))
foo(intArrayOf())
foo(longArrayOf())
foo(shortArrayOf())
foo(byteArrayOf())
foo(charArrayOf())
foo(doubleArrayOf())
foo(floatArrayOf())
foo(booleanArrayOf())
arrayOf("").clone()
intArrayOf().clone()
longArrayOf().clone()
shortArrayOf().clone()
byteArrayOf().clone()
charArrayOf().clone()
doubleArrayOf().clone()
floatArrayOf().clone()
booleanArrayOf().clone()
return "OK"
}
@@ -0,0 +1,18 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
fun box(): String {
val s = arrayOf("live", "long")
val t: Array<String> = s.clone()
if (!(s contentEquals t)) return "Fail string"
if (s === t) return "Fail string identity"
val ss = arrayOf(s, s)
val tt: Array<Array<String>> = ss.clone()
if (!(ss contentEquals tt)) return "Fail string[]"
if (ss === tt) return "Fail string[] identity"
return "OK"
}
@@ -0,0 +1,40 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_RUNTIME
fun box(): String {
val i = intArrayOf(1, 2)
if (!(i contentEquals i.clone())) return "Fail int"
if (i.clone() === i) return "Fail int identity"
val j = longArrayOf(1L, 2L)
if (!(j contentEquals j.clone())) return "Fail long"
if (j.clone() === j) return "Fail long identity"
val s = shortArrayOf(1.toShort(), 2.toShort())
if (!(s contentEquals s.clone())) return "Fail short"
if (s.clone() === s) return "Fail short identity"
val b = byteArrayOf(1.toByte(), 2.toByte())
if (!(b contentEquals b.clone())) return "Fail byte"
if (b.clone() === b) return "Fail byte identity"
val c = charArrayOf('a', 'b')
if (!(c contentEquals c.clone())) return "Fail char"
if (c.clone() === c) return "Fail char identity"
val d = doubleArrayOf(1.0, -1.0)
if (!(d contentEquals d.clone())) return "Fail double"
if (d.clone() === d) return "Fail double identity"
val f = floatArrayOf(1f, -1f)
if (!(f contentEquals f.clone())) return "Fail float"
if (f.clone() === f) return "Fail float identity"
val z = booleanArrayOf(true, false)
if (!(z contentEquals z.clone())) return "Fail boolean"
if (z.clone() === z) return "Fail boolean identity"
return "OK"
}
@@ -0,0 +1,12 @@
operator fun ArrayList<String>.get(index1: Int, index2: Int) = this[index1 + index2]
operator fun ArrayList<String>.set(index1: Int, index2: Int, elem: String) {
this[index1 + index2] = elem
}
fun box(): String {
val s = ArrayList<String>(1)
s.add("")
s[1, -1] = "O"
s[2, -2] += "K"
return s[2, -2]
}
@@ -0,0 +1,11 @@
operator fun ArrayList<String>.get(index1: Int, index2: Int) = this[index1 + index2]
operator fun ArrayList<String>.set(index1: Int, index2: Int, elem: String) {
this[index1 + index2] = elem
}
fun box(): String {
val s = ArrayList<String>(1)
s.add("")
s[1, -1] = "OK"
return s[2, -2]
}
@@ -0,0 +1,6 @@
fun box(): String {
for (x in BooleanArray(5)) {
if (x != false) return "Fail $x"
}
return "OK"
}
@@ -0,0 +1,6 @@
fun box(): String {
for (x in ByteArray(5)) {
if (x != 0.toByte()) return "Fail $x"
}
return "OK"
}
@@ -0,0 +1,6 @@
fun box(): String {
for (x in CharArray(5)) {
if (x != 0.toChar()) return "Fail $x"
}
return "OK"
}
@@ -0,0 +1,6 @@
fun box(): String {
for (x in DoubleArray(5)) {
if (x != 0.toDouble()) return "Fail $x"
}
return "OK"
}
@@ -0,0 +1,6 @@
fun box(): String {
for (x in FloatArray(5)) {
if (x != 0.toFloat()) return "Fail $x"
}
return "OK"
}
@@ -0,0 +1,6 @@
fun box(): String {
for (x in IntArray(5)) {
if (x != 0) return "Fail $x"
}
return "OK"
}
@@ -0,0 +1,6 @@
fun box(): String {
for (x in LongArray(5)) {
if (x != 0.toLong()) return "Fail $x"
}
return "OK"
}
@@ -0,0 +1,6 @@
fun box(): String {
for (x in ShortArray(5)) {
if (x != 0.toShort()) return "Fail $x"
}
return "OK"
}
@@ -0,0 +1,9 @@
operator fun HashMap<String, Int?>.set(index: String, elem: Int?) {
this.put(index, elem)
}
fun box(): String {
val s = HashMap<String, Int?>()
s["239"] = 239
return if (s["239"] == 239) "OK" else "Fail"
}
@@ -0,0 +1,9 @@
fun test(y: Array<in Array<String>>) {
y[0] = kotlin.arrayOf("OK")
}
fun box() : String {
val x : Array<Array<*>> = kotlin.arrayOf(kotlin.arrayOf(1))
test(x)
return x[0][0] as String
}
@@ -0,0 +1,10 @@
fun box(): String {
val x : Array<Array<*>> = arrayOf(arrayOf(1))
val y : Array<in Array<String>> = x
if (y.size != 1) return "fail 1"
y[0] = arrayOf("OK")
return x[0][0] as String
}
@@ -0,0 +1,12 @@
// WITH_RUNTIME
fun box(): String {
val x: Array<List<*>> = arrayOf(listOf(1))
val y : Array<in List<String>> = x
if (y.size != 1) return "fail 1"
y[0] = listOf("OK")
return x[0][0] as String
}
@@ -0,0 +1,11 @@
// WITH_RUNTIME
fun box(): String {
val a = Array<Int>(5, {it})
val x = a.indices.iterator()
while (x.hasNext()) {
val i = x.next()
if (a[i] != i) return "Fail $i ${a[i]}"
}
return "OK"
}
@@ -0,0 +1,11 @@
// WITH_RUNTIME
fun box(): String {
val a = CharArray(5)
val x = a.indices.iterator()
while (x.hasNext()) {
val i = x.next()
if (a[i] != 0.toChar()) return "Fail $i ${a[i]}"
}
return "OK"
}
@@ -0,0 +1,9 @@
fun box(): String {
val x = Array<Int>(5, { it } ).iterator()
var i = 0
while (x.hasNext()) {
if (x.next() != i) return "Fail $i"
i++
}
return "OK"
}
@@ -0,0 +1,10 @@
fun box(): String {
val a = BooleanArray(5)
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a[i] != x.next()) return "Fail $i"
i++
}
return "OK"
}
@@ -0,0 +1,10 @@
fun box(): String {
val a = ByteArray(5)
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a[i] != x.next()) return "Fail $i"
i++
}
return "OK"
}
@@ -0,0 +1,13 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
fun box(): String {
val a = ByteArray(5)
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a[i] != x.nextByte()) return "Fail $i"
i++
}
return "OK"
}
@@ -0,0 +1,10 @@
fun box(): String {
val a = CharArray(5)
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a[i] != x.next()) return "Fail $i"
i++
}
return "OK"
}
@@ -0,0 +1,10 @@
fun box(): String {
val a = DoubleArray(5)
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a[i] != x.next()) return "Fail $i"
i++
}
return "OK"
}
@@ -0,0 +1,10 @@
fun box(): String {
val a = FloatArray(5)
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a[i] != x.next()) return "Fail $i"
i++
}
return "OK"
}
@@ -0,0 +1,10 @@
fun box(): String {
val a = IntArray(5)
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a[i] != x.next()) return "Fail $i"
i++
}
return "OK"
}
@@ -0,0 +1,10 @@
fun box(): String {
val a = LongArray(5)
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a[i] != x.next()) return "Fail $i"
i++
}
return "OK"
}
@@ -0,0 +1,13 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
fun box(): String {
val a = LongArray(5)
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a[i] != x.nextLong()) return "Fail $i"
i++
}
return "OK"
}
@@ -0,0 +1,10 @@
fun box(): String {
val a = ShortArray(5)
val x = a.iterator()
var i = 0
while (x.hasNext()) {
if (a[i] != x.next()) return "Fail $i"
i++
}
return "OK"
}
@@ -0,0 +1,27 @@
var result = 0
fun <T> Iterator<T>.foreach(action: (T) -> Unit) {
while (this.hasNext()) {
(action)(this.next())
}
}
fun <In, Out> Iterator<In>.select(f: (In) -> Out) : Iterator<Out> {
return Selector(this, f);
}
class Selector<In, Out>(val source: Iterator<In>, val f: (In) -> Out) : Iterator<Out> {
override fun hasNext(): Boolean = source.hasNext()
override fun next(): Out {
return (f)(source.next())
}
}
fun box(): String {
Array(4, { it + 1 }).iterator()
.select({i -> i * 10})
.foreach({k -> result += k})
if (result != 10+20+30+40) return "Fail: $result"
return "OK"
}
@@ -0,0 +1,58 @@
fun t1 () {
val a1 = arrayOfNulls<String>(1)
a1[0] = "0" //ok
val s = a1[0] //ok
}
fun t2 () {
val a2 = arrayOfNulls<Int>(1) as Array<Int>
a2[0] = 0 //ok
var i = a2[0] //ok
}
fun t3 () {
val a3 = arrayOfNulls<Int>(1)
a3[0] = 0 //verify error
var j = a3[0] //ok
var k : Int = a3[0] ?: 5 //ok
}
fun t4 () {
val b1 = StrangeIntArray(10)
b1[4] = 5 //ok
var i = b1[1] //ok
}
fun t5 () {
val b2 = StrangeArray<Int>(10, 0)
b2.set(4, 5) //ok
b2[4] = 5 //verify error
var i = b2.get(2) //ok
i = b2[1] //verify error
}
fun t6() {
val b3 = StrangeArray<Int?>(10, 0)
b3.set(5, 6) //ok
b3[4] = 5 //verify error
val v = b3[1] //ok
}
fun box() : String {
return "OK"
}
class StrangeArray<T>(size: Int, private var defaultValue: T) {
operator fun get(index: Int): T = defaultValue
operator fun set(index: Int, v: T) {
defaultValue = v
}
}
class StrangeIntArray(size: Int) {
private var defaultValue = 0
operator fun get(index: Int): Int = defaultValue
operator fun set(index: Int, v: Int) {
defaultValue = v
}
}
@@ -0,0 +1,77 @@
//KT-2997 Automatically cast error (Array)
fun foo(a: Any): Int {
if (a is IntArray) {
a.get(0)
a.set(0, 1)
a.iterator()
return a.size
}
if (a is ShortArray) {
a.get(0)
a.set(0, 1)
a.iterator()
return a.size
}
if (a is ByteArray) {
a.get(0)
a.set(0, 1)
a.iterator()
return a.size
}
if (a is FloatArray) {
a.get(0)
a.set(0, 1.toFloat())
a.iterator()
return a.size
}
if (a is DoubleArray) {
a.get(0)
a.set(0, 1.0)
a.iterator()
return a.size
}
if (a is BooleanArray) {
a.get(0)
a.set(0, false)
a.iterator()
return a.size
}
if (a is CharArray) {
a.get(0)
a.set(0, 'a')
a.iterator()
return a.size
}
if (a is Array<*>) {
if (a.size > 0) a.get(0)
a.iterator()
return a.size
}
return 0
}
fun box(): String {
val iA = IntArray(1)
if (foo(iA) != 1) return "fail int[]"
val sA = ShortArray(1)
if (foo(sA) != 1) return "fail short[]"
val bA = ByteArray(1)
if (foo(bA) != 1) return "fail byte[]"
val fA = FloatArray(1)
if (foo(fA) != 1) return "fail float[]"
val dA = DoubleArray(1)
if (foo(dA) != 1) return "fail double[]"
val boolA = BooleanArray(1)
if (foo(boolA) != 1) return "fail boolean[]"
val cA = CharArray(1)
if (foo(cA) != 1) return "fail char[]"
val oA = arrayOfNulls<Int>(1)
if (foo(oA) != 1) return "fail Any[]"
val sArray = arrayOfNulls<String>(0)
if (foo(sArray) != 0) return "fail String[]"
return "OK"
}
@@ -0,0 +1,6 @@
fun box () : String {
val s = ArrayList<String>()
s.add("foo")
s[0] += "bar"
return if(s[0] == "foobar") "OK" else "fail"
}
@@ -0,0 +1,14 @@
fun fill(dest : Array<in String>, v : String) {
dest[0] = v
}
fun box() : String {
//fun main(args : Array<String>) {
val s : String = "bar"
val any : Array<Any> = arrayOf(1, "foo", 1.234)
fill(any, s)
/* shouldn't throw
ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
*/
return "OK"
}

Some files were not shown because too many files have changed in this diff Show More