diff --git a/libraries/stdlib/src/kotlin/Ranges.kt b/libraries/stdlib/src/kotlin/Ranges.kt index aa384d2b093..c8bcb93f2ea 100644 --- a/libraries/stdlib/src/kotlin/Ranges.kt +++ b/libraries/stdlib/src/kotlin/Ranges.kt @@ -139,11 +139,13 @@ public fun LongRange.step(step: Long): LongProgression { } public fun FloatRange.step(step: Float): FloatProgression { + if (java.lang.Float.isNaN(step)) throw IllegalArgumentException("Step must not be NaN") checkStepIsPositive(step > 0, step) return FloatProgression(start, end, step) } public fun DoubleRange.step(step: Double): DoubleProgression { + if (java.lang.Double.isNaN(step)) throw IllegalArgumentException("Step must not be NaN") checkStepIsPositive(step > 0, step) return DoubleProgression(start, end, step) } diff --git a/libraries/stdlib/test/language/RangeTest.kt b/libraries/stdlib/test/language/RangeTest.kt index 0f5a2f9e4d8..9fd58cac6d7 100644 --- a/libraries/stdlib/test/language/RangeTest.kt +++ b/libraries/stdlib/test/language/RangeTest.kt @@ -184,5 +184,15 @@ public class RangeTest { failsWith(javaClass()) { 'z' downTo 'a' step -2 } failsWith(javaClass()) { 0.0 downTo -5.0 step -0.5 } failsWith(javaClass()) { 0.0.toFloat() downTo -5.0.toFloat() step -0.5.toFloat() } + + // NaN increment or step + failsWith(javaClass()) { DoubleProgression(0.0, 5.0, jDouble.NaN) } + failsWith(javaClass()) { FloatProgression(0.0.toFloat(), 5.0.toFloat(), jFloat.NaN) } + + failsWith(javaClass()) { 0.0..5.0 step jDouble.NaN } + failsWith(javaClass()) { 0.0.toFloat()..5.0.toFloat() step jFloat.NaN } + + failsWith(javaClass()) { 5.0 downTo 0.0 step jDouble.NaN } + failsWith(javaClass()) { 5.0.toFloat() downTo 0.0.toFloat() step jFloat.NaN } } } \ No newline at end of file diff --git a/runtime/src/jet/DoubleProgression.java b/runtime/src/jet/DoubleProgression.java index 7edd3797174..bd99e549ef3 100644 --- a/runtime/src/jet/DoubleProgression.java +++ b/runtime/src/jet/DoubleProgression.java @@ -25,6 +25,9 @@ public class DoubleProgression implements Progression { private final double increment; public DoubleProgression(double start, double end, double increment) { + if (Double.isNaN(increment)) { + throw new IllegalArgumentException("Increment must be not NaN"); + } if (increment == 0.0 || increment == -0.0) { throw new IllegalArgumentException("Increment must be non-zero: " + increment); } diff --git a/runtime/src/jet/FloatProgression.java b/runtime/src/jet/FloatProgression.java index 4d91b7bed32..6035b7bff8c 100644 --- a/runtime/src/jet/FloatProgression.java +++ b/runtime/src/jet/FloatProgression.java @@ -25,6 +25,9 @@ public class FloatProgression implements Progression { private final float increment; public FloatProgression(float start, float end, float increment) { + if (Float.isNaN(increment)) { + throw new IllegalArgumentException("Increment must be not NaN"); + } if (increment == 0.0f || increment == -0.0f) { throw new IllegalArgumentException("Increment must be non-zero: " + increment); }