summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/basics/builtin_range_maxsize.py38
-rw-r--r--tests/cpydiff/types_range_limits.py26
2 files changed, 64 insertions, 0 deletions
diff --git a/tests/basics/builtin_range_maxsize.py b/tests/basics/builtin_range_maxsize.py
new file mode 100644
index 000000000..b0f3a5e51
--- /dev/null
+++ b/tests/basics/builtin_range_maxsize.py
@@ -0,0 +1,38 @@
+try:
+ from sys import maxsize
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+# Test the range builtin at extreme values. (https://github.com/micropython/micropython/issues/17684)
+#
+# This is written using asserts instead of prints because the value of `maxsize` differs.
+#
+# Numbers & counts right up against the max of mp_int_t also cause overflows, such as
+# objrange.c:115:14: runtime error: signed integer overflow: 9223372036854775807 + 1 cannot be represented in type 'long int'
+# so just avoid them for the purposes of this test.
+
+r = range(-maxsize + 1, -1)
+assert r.start == -maxsize + 1
+assert r.stop == -1
+assert r[0] == -maxsize + 1
+assert r[1] == -maxsize + 2
+assert r[-1] == -2
+assert r[-2] == -3
+
+ir = iter(r)
+assert next(ir) == -maxsize + 1
+assert next(ir) == -maxsize + 2
+
+r = range(0, maxsize - 1)
+assert len(r) == maxsize - 1
+assert r.stop == maxsize - 1
+
+r = range(maxsize, 0, -1)
+assert len(r) == maxsize
+assert r.start == maxsize
+assert r[0] == maxsize
+assert r[1] == maxsize - 1
+ir = iter(r)
+assert next(ir) == maxsize
+assert next(ir) == maxsize - 1
diff --git a/tests/cpydiff/types_range_limits.py b/tests/cpydiff/types_range_limits.py
new file mode 100644
index 000000000..e53d5fd40
--- /dev/null
+++ b/tests/cpydiff/types_range_limits.py
@@ -0,0 +1,26 @@
+"""
+categories: Types,range
+description: Range objects with large start or stop arguments misbehave.
+cause: Intermediate calculations overflow the C mp_int_t type
+workaround: Avoid using such ranges
+"""
+
+from sys import maxsize
+
+# A range including `maxsize-1` cannot be created
+try:
+ print(range(-maxsize - 1, 0))
+except OverflowError:
+ print("OverflowError")
+
+# A range with `stop-start` exceeding sys.maxsize has incorrect len(), while CPython cannot calculate len().
+try:
+ print(len(range(-maxsize, maxsize)))
+except OverflowError:
+ print("OverflowError")
+
+# A range with `stop-start` exceeding sys.maxsize has incorrect len()
+try:
+ print(len(range(-maxsize, maxsize, maxsize)))
+except OverflowError:
+ print("OverflowError")