IR: add an emptiness check to all unsigned until loops
Unlike signed integers, a larger unsigned type does not mean a lower minimum value, so `x - 1` can overflow even if `x` is casted to a larger type. #KT-42186 Fixed
This commit is contained in:
@@ -4,27 +4,89 @@
|
||||
|
||||
|
||||
val MinI = Int.MIN_VALUE
|
||||
val MinB = Byte.MIN_VALUE
|
||||
val MinS = Short.MIN_VALUE
|
||||
val MinL = Long.MIN_VALUE
|
||||
|
||||
fun box(): String {
|
||||
val list1 = ArrayList<Int>()
|
||||
val range1 = 0..MinI step 3
|
||||
val range1 = 0.toByte()..MinB step 3
|
||||
for (i in range1) {
|
||||
list1.add(i)
|
||||
if (list1.size > 23) break
|
||||
}
|
||||
if (list1 != listOf<Int>()) {
|
||||
return "Wrong elements for 0..MinI step 3: $list1"
|
||||
return "Wrong elements for 0.toByte()..MinB step 3: $list1"
|
||||
}
|
||||
|
||||
val list2 = ArrayList<Long>()
|
||||
val range2 = 0L..MinL step 3
|
||||
val list2 = ArrayList<Int>()
|
||||
val range2 = 0.toShort()..MinS step 3
|
||||
for (i in range2) {
|
||||
list2.add(i)
|
||||
if (list2.size > 23) break
|
||||
}
|
||||
if (list2 != listOf<Long>()) {
|
||||
return "Wrong elements for 0L..MinL step 3: $list2"
|
||||
if (list2 != listOf<Int>()) {
|
||||
return "Wrong elements for 0.toShort()..MinS step 3: $list2"
|
||||
}
|
||||
|
||||
val list3 = ArrayList<Int>()
|
||||
val range3 = 0..MinI step 3
|
||||
for (i in range3) {
|
||||
list3.add(i)
|
||||
if (list3.size > 23) break
|
||||
}
|
||||
if (list3 != listOf<Int>()) {
|
||||
return "Wrong elements for 0..MinI step 3: $list3"
|
||||
}
|
||||
|
||||
val list4 = ArrayList<Long>()
|
||||
val range4 = 0L..MinL step 3
|
||||
for (i in range4) {
|
||||
list4.add(i)
|
||||
if (list4.size > 23) break
|
||||
}
|
||||
if (list4 != listOf<Long>()) {
|
||||
return "Wrong elements for 0L..MinL step 3: $list4"
|
||||
}
|
||||
|
||||
val list5 = ArrayList<Int>()
|
||||
val range5 = 0.toByte() until MinB step 3
|
||||
for (i in range5) {
|
||||
list5.add(i)
|
||||
if (list5.size > 23) break
|
||||
}
|
||||
if (list5 != listOf<Int>()) {
|
||||
return "Wrong elements for 0.toByte() until MinB step 3: $list5"
|
||||
}
|
||||
|
||||
val list6 = ArrayList<Int>()
|
||||
val range6 = 0.toShort() until MinS step 3
|
||||
for (i in range6) {
|
||||
list6.add(i)
|
||||
if (list6.size > 23) break
|
||||
}
|
||||
if (list6 != listOf<Int>()) {
|
||||
return "Wrong elements for 0.toShort() until MinS step 3: $list6"
|
||||
}
|
||||
|
||||
val list7 = ArrayList<Int>()
|
||||
val range7 = 0 until MinI step 3
|
||||
for (i in range7) {
|
||||
list7.add(i)
|
||||
if (list7.size > 23) break
|
||||
}
|
||||
if (list7 != listOf<Int>()) {
|
||||
return "Wrong elements for 0 until MinI step 3: $list7"
|
||||
}
|
||||
|
||||
val list8 = ArrayList<Long>()
|
||||
val range8 = 0L until MinL step 3
|
||||
for (i in range8) {
|
||||
list8.add(i)
|
||||
if (list8.size > 23) break
|
||||
}
|
||||
if (list8 != listOf<Long>()) {
|
||||
return "Wrong elements for 0L until MinL step 3: $list8"
|
||||
}
|
||||
|
||||
return "OK"
|
||||
|
||||
Reference in New Issue
Block a user