| // TARGET_BACKEND: NATIVE | |
| // FILECHECK_STAGE: CStubs | |
| // CHECK-LABEL: define void @"kfun:#forEachIndicies(){}"() | |
| fun forEachIndicies() { | |
| val array = Array(10) { 0 } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in array.indices) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[i] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forUntilSize(){}"() | |
| fun forUntilSize() { | |
| val array = Array(10) { 0L } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0 until array.size) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[i] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forRangeUntilSize(){}"() | |
| @ExperimentalStdlibApi | |
| fun forRangeUntilSize() { | |
| val array = Array(10) { 0L } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0..<array.size) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[i] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forDownToSize(){}"() | |
| fun forDownToSize() { | |
| val array = Array(10) { 0L } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in array.size - 1 downTo 0) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[i] = 6 | |
| } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (j in array.size - 3 downTo 0) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[j] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forRangeToSize(){}"() | |
| fun forRangeToSize() { | |
| val array = Array(10) { 0L } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0..array.size - 1) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[i] = 6 | |
| } | |
| val length = array.size - 1 | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (j in 0..length) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[j] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forRangeToWithStep(){}"() | |
| fun forRangeToWithStep() { | |
| val array = Array(10) { 0L } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0..array.size - 1 step 2) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[i] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forUntilWithStep(){}"() | |
| fun forUntilWithStep() { | |
| val array = CharArray(10) { '0' } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0 until array.size step 2) { | |
| // CHECK: {{call|invoke}} void @Kotlin_CharArray_set_without_BoundCheck | |
| array[i] = '6' | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forRangeUntilWithStep(){}"() | |
| @ExperimentalStdlibApi | |
| fun forRangeUntilWithStep() { | |
| val array = CharArray(10) { '0' } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0..<array.size step 2) { | |
| // CHECK: {{call|invoke}} void @Kotlin_CharArray_set_without_BoundCheck | |
| array[i] = '6' | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forDownToWithStep(){}"() | |
| fun forDownToWithStep() { | |
| val array = UIntArray(10) { 0U } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in array.size - 1 downTo 0 step 2) { | |
| // CHECK: {{call|invoke}} void @Kotlin_IntArray_set_without_BoundCheck | |
| array[i] = 6U | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forIndiciesWithStep(){}"() | |
| fun forIndiciesWithStep() { | |
| val array = Array(10) { 0L } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in array.indices step 2) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[i] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forWithIndex(){}"() | |
| fun forWithIndex() { | |
| val array = Array(10) { 100 } | |
| // CHECK: {{^}}while_loop{{.*}}: | |
| for ((index, value) in array.withIndex()) { | |
| // CHECK: {{call|invoke}} ptr @Kotlin_Array_get_without_BoundCheck | |
| array[index] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forReversed(){}"() | |
| fun forReversed() { | |
| val array = Array(10) { 100 } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in (0..array.size-1).reversed()) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[i] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forRangeUntilReversed(){}"() | |
| @ExperimentalStdlibApi | |
| fun forRangeUntilReversed() { | |
| val array = Array(10) { 100 } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in (0..<array.size).reversed()) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[i] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| fun foo(a: Int, b : Int): Int = a + b * 2 | |
| // CHECK-LABEL: define void @"kfun:#forEachCall(){}"() | |
| fun forEachCall() { | |
| val array = Array(10) { 100 } | |
| var sum = 0 | |
| // CHECK: {{^}}while_loop{{.*}}: | |
| array.forEach { | |
| // CHECK: {{call|invoke}} ptr @Kotlin_Array_get_without_BoundCheck | |
| sum += it | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#forLoop(){}"() | |
| fun forLoop() { | |
| val array = Array(10) { 100 } | |
| var sum = 0 | |
| // CHECK: {{^}}while_loop{{.*}}: | |
| for (it in array) { | |
| // CHECK: {{call|invoke}} ptr @Kotlin_Array_get_without_BoundCheck | |
| sum += it | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#innerLoop(){}"() | |
| fun innerLoop() { | |
| val array = Array(10) { 100 } | |
| val array1 = Array(3) { 0 } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0 until array.size) { | |
| // CHECK-DAG: {{call|invoke}} ptr @Kotlin_Array_get_without_BoundCheck | |
| array[i] = 7 | |
| // CHECK-DAG: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| // CHECK-DAG: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| for (j in 0 until array1.size) { | |
| array1[j] = array[i] | |
| } | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#argsInFunctionCall(){}"() | |
| fun argsInFunctionCall() { | |
| val array = Array(10) { 100 } | |
| val size = array.size - 1 | |
| val size1 = size | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0..size1) { | |
| // CHECK: {{call|invoke}} ptr @Kotlin_Array_get_without_BoundCheck | |
| // CHECK: {{call|invoke}} ptr @Kotlin_Array_get_without_BoundCheck | |
| // CHECK: {{call|invoke}} i32 @"kfun:#foo(kotlin.Int;kotlin.Int){}kotlin.Int" | |
| foo(array[i], array[i]) | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define void @"kfun:#smallLoop(){}"() | |
| fun smallLoop() { | |
| val array = Array(10) { 100 } | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0..array.size - 2) { | |
| // CHECK: {{call|invoke}} ptr @Kotlin_Array_get_without_BoundCheck | |
| array[i+1] = array[i] | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| object TopLevelObject { | |
| val array = Array(10) { 100 } | |
| } | |
| // CHECK-LABEL: define void @"kfun:#topLevelObject(){}"() | |
| fun topLevelObject() { | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0 until TopLevelObject.array.size) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| TopLevelObject.array[i] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| val array = Array(10) { 100 } | |
| // CHECK-LABEL: define void @"kfun:#topLevelProperty(){}"() | |
| fun topLevelProperty() { | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0..array.size - 2) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| array[i] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| open class Base() { | |
| open val array = Array(10) { 100 } | |
| } | |
| class Child() : Base() | |
| // CHECK-LABEL: define void @"kfun:#childClassWithFakeOverride(){}"() | |
| fun childClassWithFakeOverride() { | |
| val child = Child() | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0..child.array.size - 1) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| child.array[i] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| class First { | |
| val child = Child() | |
| } | |
| class Second{ | |
| val first = First() | |
| } | |
| class Third { | |
| val second = Second() | |
| } | |
| // CHECK-LABEL: define void @"kfun:#chainedReceivers(){}"() | |
| fun chainedReceivers() { | |
| val obj = Third() | |
| val obj1 = obj | |
| val obj2 = obj1 | |
| // CHECK: {{^}}do_while_loop{{.*}}: | |
| for (i in 0 until obj1.second.first.child.array.size) { | |
| // CHECK: {{call|invoke}} void @Kotlin_Array_set_without_BoundCheck | |
| obj2.second.first.child.array[i] = 6 | |
| } | |
| } | |
| // CHECK-LABEL: {{^}}epilogue: | |
| // CHECK-LABEL: define ptr @"kfun:#box(){}kotlin.String" | |
| @ExperimentalStdlibApi | |
| fun box(): String { | |
| forEachIndicies() | |
| forUntilSize() | |
| forRangeUntilSize() | |
| forDownToSize() | |
| forRangeToSize() | |
| forRangeToWithStep() | |
| forUntilWithStep() | |
| forRangeUntilWithStep() | |
| forDownToWithStep() | |
| forIndiciesWithStep() | |
| forWithIndex() | |
| forReversed() | |
| forRangeUntilReversed() | |
| forEachCall() | |
| forLoop() | |
| innerLoop() | |
| argsInFunctionCall() | |
| smallLoop() | |
| topLevelObject() | |
| topLevelProperty() | |
| childClassWithFakeOverride() | |
| chainedReceivers() | |
| return "OK" | |
| } |