From c885cadde434debcc98e82b23d19b9e201fbed73 Mon Sep 17 00:00:00 2001 From: Eduard Wolf Date: Mon, 27 May 2019 19:16:13 +0200 Subject: [PATCH] KT-31639: Fix Iterables.drop integer overflow --- libraries/stdlib/common/src/generated/_Collections.kt | 2 +- .../jvm/testLongRunning/collections/IndexOverflowJVMTest.kt | 6 ++++++ .../tools/kotlin-stdlib-gen/src/templates/Filtering.kt | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libraries/stdlib/common/src/generated/_Collections.kt b/libraries/stdlib/common/src/generated/_Collections.kt index bc56551807b..f0e538723c7 100644 --- a/libraries/stdlib/common/src/generated/_Collections.kt +++ b/libraries/stdlib/common/src/generated/_Collections.kt @@ -614,7 +614,7 @@ public fun Iterable.drop(n: Int): List { } var count = 0 for (item in this) { - if (count++ >= n) list.add(item) + if (count >= n) list.add(item) else ++count } return list.optimizeReadOnlyList() } diff --git a/libraries/stdlib/jvm/testLongRunning/collections/IndexOverflowJVMTest.kt b/libraries/stdlib/jvm/testLongRunning/collections/IndexOverflowJVMTest.kt index e846ca5948a..f1e3f79af04 100644 --- a/libraries/stdlib/jvm/testLongRunning/collections/IndexOverflowJVMTest.kt +++ b/libraries/stdlib/jvm/testLongRunning/collections/IndexOverflowJVMTest.kt @@ -156,4 +156,10 @@ class IndexOverflowJVMTest { assertEquals(expectedEnd, dropTake.last()) } + @Test + fun dropMaxValue() { + val range = 0L..Int.MAX_VALUE + 1L + assertEquals(listOf(Int.MAX_VALUE.toLong(), Int.MAX_VALUE + 1L), range.drop(Int.MAX_VALUE)) + } + } \ No newline at end of file diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt index 0c2c36c5ea5..952911edaf5 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt @@ -84,7 +84,7 @@ object Filtering : TemplateGroupBase() { } var count = 0 for (item in this) { - if (count++ >= n) list.add(item) + if (count >= n) list.add(item) else ++count } return list.optimizeReadOnlyList() """