]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-135763: AC: Use ``Py_ssize_t(allow_negative=False)`` (#138394)
authorAdam Turner <9087854+AA-Turner@users.noreply.github.com>
Tue, 2 Sep 2025 20:29:05 +0000 (22:29 +0200)
committerGitHub <noreply@github.com>
Tue, 2 Sep 2025 20:29:05 +0000 (21:29 +0100)
18 files changed:
Modules/_bisectmodule.c
Modules/_ctypes/_ctypes.c
Modules/_ctypes/clinic/_ctypes.c.h
Modules/_hashopenssl.c
Modules/arraymodule.c
Modules/clinic/_bisectmodule.c.h
Modules/clinic/_hashopenssl.c.h
Modules/clinic/arraymodule.c.h
Modules/clinic/itertoolsmodule.c.h
Modules/clinic/posixmodule.c.h
Modules/clinic/sha3module.c.h
Modules/clinic/zlibmodule.c.h
Modules/itertoolsmodule.c
Modules/posixmodule.c
Modules/sha3module.c
Modules/zlibmodule.c
Objects/clinic/longobject.c.h
Objects/longobject.c

index 9b146265445d9abffc6da681dce94fb4e487d71d..3a1491e5b96f29b0cfac894cfc6c28a91c0be50e 100644 (file)
@@ -57,10 +57,6 @@ internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t
     Py_ssize_t mid;
     int res;
 
-    if (lo < 0) {
-        PyErr_SetString(PyExc_ValueError, "lo must be non-negative");
-        return -1;
-    }
     if (hi == -1) {
         hi = PySequence_Size(list);
         if (hi < 0)
@@ -153,7 +149,7 @@ _bisect.bisect_right -> Py_ssize_t
 
     a: object
     x: object
-    lo: Py_ssize_t = 0
+    lo: Py_ssize_t(allow_negative=False) = 0
     hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None
     *
     key: object = None
@@ -173,7 +169,7 @@ A custom key function can be supplied to customize the sort order.
 static Py_ssize_t
 _bisect_bisect_right_impl(PyObject *module, PyObject *a, PyObject *x,
                           Py_ssize_t lo, Py_ssize_t hi, PyObject *key)
-/*[clinic end generated code: output=3a4bc09cc7c8a73d input=43071869772dd53a]*/
+/*[clinic end generated code: output=3a4bc09cc7c8a73d input=b476bc45667273ac]*/
 {
     return internal_bisect_right(a, x, lo, hi, key);
 }
@@ -183,7 +179,7 @@ _bisect.insort_right
 
     a: object
     x: object
-    lo: Py_ssize_t = 0
+    lo: Py_ssize_t(allow_negative=False) = 0
     hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None
     *
     key: object = None
@@ -201,7 +197,7 @@ A custom key function can be supplied to customize the sort order.
 static PyObject *
 _bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x,
                           Py_ssize_t lo, Py_ssize_t hi, PyObject *key)
-/*[clinic end generated code: output=ac3bf26d07aedda2 input=f60777d2b6ddb239]*/
+/*[clinic end generated code: output=ac3bf26d07aedda2 input=f2caa8abec0763e8]*/
 {
     PyObject *result, *key_x;
     Py_ssize_t index;
@@ -241,10 +237,6 @@ internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t h
     Py_ssize_t mid;
     int res;
 
-    if (lo < 0) {
-        PyErr_SetString(PyExc_ValueError, "lo must be non-negative");
-        return -1;
-    }
     if (hi == -1) {
         hi = PySequence_Size(list);
         if (hi < 0)
@@ -338,7 +330,7 @@ _bisect.bisect_left -> Py_ssize_t
 
     a: object
     x: object
-    lo: Py_ssize_t = 0
+    lo: Py_ssize_t(allow_negative=False) = 0
     hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None
     *
     key: object = None
@@ -358,7 +350,7 @@ A custom key function can be supplied to customize the sort order.
 static Py_ssize_t
 _bisect_bisect_left_impl(PyObject *module, PyObject *a, PyObject *x,
                          Py_ssize_t lo, Py_ssize_t hi, PyObject *key)
-/*[clinic end generated code: output=70749d6e5cae9284 input=f29c4fe7f9b797c7]*/
+/*[clinic end generated code: output=70749d6e5cae9284 input=9b4d49b5ddecfad7]*/
 {
     return internal_bisect_left(a, x, lo, hi, key);
 }
@@ -369,7 +361,7 @@ _bisect.insort_left
 
     a: object
     x: object
-    lo: Py_ssize_t = 0
+    lo: Py_ssize_t(allow_negative=False) = 0
     hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None
     *
     key: object = None
@@ -387,7 +379,7 @@ A custom key function can be supplied to customize the sort order.
 static PyObject *
 _bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x,
                          Py_ssize_t lo, Py_ssize_t hi, PyObject *key)
-/*[clinic end generated code: output=b1d33e5e7ffff11e input=0a700a82edbd472c]*/
+/*[clinic end generated code: output=b1d33e5e7ffff11e input=ff85a79826e22f31]*/
 {
     PyObject *result, *key_x;
     Py_ssize_t index;
index 4bd3e380b3bc4ba89b25444101dd814bd2883ba8..914833a3f398087281f0e09acab412012dadd9f6 100644 (file)
@@ -859,7 +859,7 @@ _ctypes.CDataType.from_buffer as CDataType_from_buffer
     type: self
     cls: defining_class
     obj: object
-    offset: Py_ssize_t = 0
+    offset: Py_ssize_t(allow_negative=False) = 0
     /
 
 C.from_buffer(object, offset=0) -> C instance
@@ -870,7 +870,7 @@ Create a C instance from a writeable buffer.
 static PyObject *
 CDataType_from_buffer_impl(PyObject *type, PyTypeObject *cls, PyObject *obj,
                            Py_ssize_t offset)
-/*[clinic end generated code: output=57604e99635abd31 input=0f36cedd105ca28d]*/
+/*[clinic end generated code: output=57604e99635abd31 input=8f43e6bc44373180]*/
 {
     PyObject *mv;
     PyObject *result;
@@ -906,13 +906,6 @@ CDataType_from_buffer_impl(PyObject *type, PyTypeObject *cls, PyObject *obj,
         return NULL;
     }
 
-    if (offset < 0) {
-        PyErr_SetString(PyExc_ValueError,
-                        "offset cannot be negative");
-        Py_DECREF(mv);
-        return NULL;
-    }
-
     if (info->size > buffer->len - offset) {
         PyErr_Format(PyExc_ValueError,
                      "Buffer size too small "
@@ -955,7 +948,7 @@ _ctypes.CDataType.from_buffer_copy as CDataType_from_buffer_copy
     type: self
     cls: defining_class
     buffer: Py_buffer
-    offset: Py_ssize_t = 0
+    offset: Py_ssize_t(allow_negative=False) = 0
     /
 
 C.from_buffer_copy(object, offset=0) -> C instance
@@ -966,7 +959,7 @@ Create a C instance from a readable buffer.
 static PyObject *
 CDataType_from_buffer_copy_impl(PyObject *type, PyTypeObject *cls,
                                 Py_buffer *buffer, Py_ssize_t offset)
-/*[clinic end generated code: output=c8fc62b03e5cc6fa input=2a81e11b765a6253]*/
+/*[clinic end generated code: output=c8fc62b03e5cc6fa input=41f97f512295ceec]*/
 {
     PyObject *result;
 
@@ -980,12 +973,6 @@ CDataType_from_buffer_copy_impl(PyObject *type, PyTypeObject *cls,
         return NULL;
     }
 
-    if (offset < 0) {
-        PyErr_SetString(PyExc_ValueError,
-                        "offset cannot be negative");
-        return NULL;
-    }
-
     if (info->size > buffer->len - offset) {
         PyErr_Format(PyExc_ValueError,
                      "Buffer size too small (%zd instead of at least %zd bytes)",
index cf2e3fa21072ae03eb5924e47d6649a420af42bf..529872f0f17ebe9368dfe4c5c5604701853d22b4 100644 (file)
@@ -176,6 +176,11 @@ CDataType_from_buffer(PyObject *type, PyTypeObject *cls, PyObject *const *args,
             goto exit;
         }
         offset = ival;
+        if (offset < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "offset cannot be negative");
+            goto exit;
+        }
     }
 skip_optional_posonly:
     return_value = CDataType_from_buffer_impl(type, cls, obj, offset);
@@ -242,6 +247,11 @@ CDataType_from_buffer_copy(PyObject *type, PyTypeObject *cls, PyObject *const *a
             goto exit;
         }
         offset = ival;
+        if (offset < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "offset cannot be negative");
+            goto exit;
+        }
     }
 skip_optional_posonly:
     return_value = CDataType_from_buffer_copy_impl(type, cls, &buffer, offset);
@@ -1042,4 +1052,4 @@ Simple_from_outparm(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py
     }
     return Simple_from_outparm_impl(self, cls);
 }
-/*[clinic end generated code: output=536c9bcf4e05913e input=a9049054013a1b77]*/
+/*[clinic end generated code: output=22105663d71237ca input=a9049054013a1b77]*/
index a6496d0f04f2d09726822e1526abcde3fc6d1d17..d34dfad33ff6668843724ccbc1d02def8e006dba 100644 (file)
@@ -1017,23 +1017,18 @@ static PyType_Spec HASHobject_type_spec = {
 /*[clinic input]
 _hashlib.HASHXOF.digest
 
-  length: Py_ssize_t
+  length: Py_ssize_t(allow_negative=False)
 
 Return the digest value as a bytes object.
 [clinic start generated code]*/
 
 static PyObject *
 _hashlib_HASHXOF_digest_impl(HASHobject *self, Py_ssize_t length)
-/*[clinic end generated code: output=dcb09335dd2fe908 input=3eb034ce03c55b21]*/
+/*[clinic end generated code: output=dcb09335dd2fe908 input=224d047da2c12a42]*/
 {
     EVP_MD_CTX *temp_ctx;
     PyObject *retval;
 
-    if (length < 0) {
-        PyErr_SetString(PyExc_ValueError, "negative digest length");
-        return NULL;
-    }
-
     if (length == 0) {
         return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES);
     }
@@ -1072,24 +1067,19 @@ error:
 /*[clinic input]
 _hashlib.HASHXOF.hexdigest
 
-    length: Py_ssize_t
+    length: Py_ssize_t(allow_negative=False)
 
 Return the digest value as a string of hexadecimal digits.
 [clinic start generated code]*/
 
 static PyObject *
 _hashlib_HASHXOF_hexdigest_impl(HASHobject *self, Py_ssize_t length)
-/*[clinic end generated code: output=519431cafa014f39 input=0e58f7238adb7ab8]*/
+/*[clinic end generated code: output=519431cafa014f39 input=4a41b8ab5d3bfee2]*/
 {
     unsigned char *digest;
     EVP_MD_CTX *temp_ctx;
     PyObject *retval;
 
-    if (length < 0) {
-        PyErr_SetString(PyExc_ValueError, "negative digest length");
-        return NULL;
-    }
-
     if (length == 0) {
         return Py_GetConstant(Py_CONSTANT_EMPTY_STR);
     }
index d9ac5b97f8258f6d5eb300945e6224b87e98ea0c..d97cf7af767ca3fcd92ff972da7dcd1be5694834 100644 (file)
@@ -1518,7 +1518,7 @@ array.array.fromfile
 
     cls: defining_class
     f: object
-    n: Py_ssize_t
+    n: Py_ssize_t(allow_negative=False)
     /
 
 Read n objects from the file object f and append them to the end of the array.
@@ -1527,17 +1527,13 @@ Read n objects from the file object f and append them to the end of the array.
 static PyObject *
 array_array_fromfile_impl(arrayobject *self, PyTypeObject *cls, PyObject *f,
                           Py_ssize_t n)
-/*[clinic end generated code: output=83a667080b345ebc input=b2b4bdfb7ad4d4ae]*/
+/*[clinic end generated code: output=83a667080b345ebc input=db46b06ac1b6de87]*/
 {
     PyObject *b, *res;
     Py_ssize_t itemsize = self->ob_descr->itemsize;
     Py_ssize_t nbytes;
     int not_enough_bytes;
 
-    if (n < 0) {
-        PyErr_SetString(PyExc_ValueError, "negative count");
-        return NULL;
-    }
     if (n > PY_SSIZE_T_MAX / itemsize) {
         PyErr_NoMemory();
         return NULL;
index 314208bc41d0c113e849a07bb3d3e9856e0fa811..8f3492cd54b5f2f8dfbcdb74ecd753d0857ec01d 100644 (file)
@@ -93,6 +93,11 @@ _bisect_bisect_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs,
                 goto exit;
             }
             lo = ival;
+            if (lo < 0) {
+                PyErr_SetString(PyExc_ValueError,
+                                "lo cannot be negative");
+                goto exit;
+            }
         }
         if (!--noptargs) {
             goto skip_optional_pos;
@@ -203,6 +208,11 @@ _bisect_insort_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs,
                 goto exit;
             }
             lo = ival;
+            if (lo < 0) {
+                PyErr_SetString(PyExc_ValueError,
+                                "lo cannot be negative");
+                goto exit;
+            }
         }
         if (!--noptargs) {
             goto skip_optional_pos;
@@ -312,6 +322,11 @@ _bisect_bisect_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P
                 goto exit;
             }
             lo = ival;
+            if (lo < 0) {
+                PyErr_SetString(PyExc_ValueError,
+                                "lo cannot be negative");
+                goto exit;
+            }
         }
         if (!--noptargs) {
             goto skip_optional_pos;
@@ -422,6 +437,11 @@ _bisect_insort_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P
                 goto exit;
             }
             lo = ival;
+            if (lo < 0) {
+                PyErr_SetString(PyExc_ValueError,
+                                "lo cannot be negative");
+                goto exit;
+            }
         }
         if (!--noptargs) {
             goto skip_optional_pos;
@@ -446,4 +466,4 @@ skip_optional_kwonly:
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=729385c6a23828ab input=a9049054013a1b77]*/
+/*[clinic end generated code: output=a3c44ed440dd6d81 input=a9049054013a1b77]*/
index 3d81a6dcce1440feef6838f0002333bf298c1931..7ae7be185eceb5817ef4eabad04de6908a9fa163 100644 (file)
@@ -150,6 +150,11 @@ _hashlib_HASHXOF_digest(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
             goto exit;
         }
         length = ival;
+        if (length < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "length cannot be negative");
+            goto exit;
+        }
     }
     return_value = _hashlib_HASHXOF_digest_impl((HASHobject *)self, length);
 
@@ -223,6 +228,11 @@ _hashlib_HASHXOF_hexdigest(PyObject *self, PyObject *const *args, Py_ssize_t nar
             goto exit;
         }
         length = ival;
+        if (length < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "length cannot be negative");
+            goto exit;
+        }
     }
     return_value = _hashlib_HASHXOF_hexdigest_impl((HASHobject *)self, length);
 
@@ -1976,4 +1986,4 @@ exit:
 #ifndef _HASHLIB_OPENSSL_SHAKE_256_METHODDEF
     #define _HASHLIB_OPENSSL_SHAKE_256_METHODDEF
 #endif /* !defined(_HASHLIB_OPENSSL_SHAKE_256_METHODDEF) */
-/*[clinic end generated code: output=cd5ff436f6dc2938 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=9ba35fcc33795b1e input=a9049054013a1b77]*/
index 97e5ca771f3a90b2880d27dd10683be39699acc0..2648583c654a0402b899b8af1dbd434786b0e9e1 100644 (file)
@@ -419,6 +419,11 @@ array_array_fromfile(PyObject *self, PyTypeObject *cls, PyObject *const *args, P
             goto exit;
         }
         n = ival;
+        if (n < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "n cannot be negative");
+            goto exit;
+        }
     }
     return_value = array_array_fromfile_impl((arrayobject *)self, cls, f, n);
 
@@ -773,4 +778,4 @@ array_arrayiterator___setstate__(PyObject *self, PyObject *state)
 
     return return_value;
 }
-/*[clinic end generated code: output=dd49451ac1cc3f39 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=c993c3598085840e input=a9049054013a1b77]*/
index 0af82e7eb05be8db5dd350baf6ee216b2ab5055c..49816bfcb42feca7f9fb91e1205e9035c00ef12e 100644 (file)
@@ -345,6 +345,11 @@ itertools_tee(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
             goto exit;
         }
         n = ival;
+        if (n < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "n cannot be negative");
+            goto exit;
+        }
     }
 skip_optional:
     return_value = itertools_tee_impl(module, iterable, n);
@@ -569,6 +574,11 @@ itertools_combinations(PyTypeObject *type, PyObject *args, PyObject *kwargs)
             goto exit;
         }
         r = ival;
+        if (r < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "r cannot be negative");
+            goto exit;
+        }
     }
     return_value = itertools_combinations_impl(type, iterable, r);
 
@@ -643,6 +653,11 @@ itertools_combinations_with_replacement(PyTypeObject *type, PyObject *args, PyOb
             goto exit;
         }
         r = ival;
+        if (r < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "r cannot be negative");
+            goto exit;
+        }
     }
     return_value = itertools_combinations_with_replacement_impl(type, iterable, r);
 
@@ -965,4 +980,4 @@ skip_optional_pos:
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=999758202a532e0a input=a9049054013a1b77]*/
+/*[clinic end generated code: output=7f385837b13edbeb input=a9049054013a1b77]*/
index df4f802ff0bdc9efc5b265a7eb060794df03d668..455c938afc75f0800164fabfc1120c84cf68b22b 100644 (file)
@@ -8689,6 +8689,11 @@ os_copy_file_range(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py
             goto exit;
         }
         count = ival;
+        if (count < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "count cannot be negative");
+            goto exit;
+        }
     }
     if (!noptargs) {
         goto skip_optional_pos;
@@ -8807,6 +8812,11 @@ os_splice(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k
             goto exit;
         }
         count = ival;
+        if (count < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "count cannot be negative");
+            goto exit;
+        }
     }
     if (!noptargs) {
         goto skip_optional_pos;
@@ -11237,6 +11247,11 @@ os_urandom(PyObject *module, PyObject *arg)
             goto exit;
         }
         size = ival;
+        if (size < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "size cannot be negative");
+            goto exit;
+        }
     }
     return_value = os_urandom_impl(module, size);
 
@@ -13419,4 +13434,4 @@ exit:
 #ifndef OS__EMSCRIPTEN_LOG_METHODDEF
     #define OS__EMSCRIPTEN_LOG_METHODDEF
 #endif /* !defined(OS__EMSCRIPTEN_LOG_METHODDEF) */
-/*[clinic end generated code: output=23de5d098e2dd73f input=a9049054013a1b77]*/
+/*[clinic end generated code: output=77c20b53c34ccae4 input=a9049054013a1b77]*/
index 1f631ff406e25bf07e524511617b666a8cde7a48..7fdc707626c3243d5e71746f89f172a281cd3521 100644 (file)
@@ -235,6 +235,11 @@ _sha3_shake_128_digest(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
             goto exit;
         }
         length = ival;
+        if (length < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "length cannot be negative");
+            goto exit;
+        }
     }
     return_value = _sha3_shake_128_digest_impl((SHA3object *)self, length);
 
@@ -304,10 +309,15 @@ _sha3_shake_128_hexdigest(PyObject *self, PyObject *const *args, Py_ssize_t narg
             goto exit;
         }
         length = ival;
+        if (length < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "length cannot be negative");
+            goto exit;
+        }
     }
     return_value = _sha3_shake_128_hexdigest_impl((SHA3object *)self, length);
 
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=48be77f8a31e8a3e input=a9049054013a1b77]*/
+/*[clinic end generated code: output=78284adde71d590c input=a9049054013a1b77]*/
index 658cb1c2ac3207b7cfd64e1122f9861b4f6bf8f6..6fba75339b3206885177e3dc9042cb69d89331d5 100644 (file)
@@ -189,6 +189,11 @@ zlib_decompress(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj
             goto exit;
         }
         bufsize = ival;
+        if (bufsize < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "bufsize cannot be negative");
+            goto exit;
+        }
     }
 skip_optional_pos:
     return_value = zlib_decompress_impl(module, &data, wbits, bufsize);
@@ -567,6 +572,11 @@ zlib_Decompress_decompress(PyObject *self, PyTypeObject *cls, PyObject *const *a
             goto exit;
         }
         max_length = ival;
+        if (max_length < 0) {
+            PyErr_SetString(PyExc_ValueError,
+                            "max_length cannot be negative");
+            goto exit;
+        }
     }
 skip_optional_pos:
     return_value = zlib_Decompress_decompress_impl((compobject *)self, cls, &data, max_length);
@@ -1392,4 +1402,4 @@ exit:
 #ifndef ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF
     #define ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF
 #endif /* !defined(ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF) */
-/*[clinic end generated code: output=59184b81fea41d3d input=a9049054013a1b77]*/
+/*[clinic end generated code: output=fa5fc356f3090cce input=a9049054013a1b77]*/
index bc23ad7e8488ee4532958e3094963e3239119aa1..5d2506f48e31b4688e890eefd9b5df8d7dbf6867 100644 (file)
@@ -1069,22 +1069,18 @@ static PyType_Spec tee_spec = {
 /*[clinic input]
 itertools.tee
     iterable: object
-    n: Py_ssize_t = 2
+    n: Py_ssize_t(allow_negative=False) = 2
     /
 Returns a tuple of n independent iterators.
 [clinic start generated code]*/
 
 static PyObject *
 itertools_tee_impl(PyObject *module, PyObject *iterable, Py_ssize_t n)
-/*[clinic end generated code: output=1c64519cd859c2f0 input=c99a1472c425d66d]*/
+/*[clinic end generated code: output=1c64519cd859c2f0 input=0f72d78e655f45cb]*/
 {
     Py_ssize_t i;
     PyObject *it, *to, *result;
 
-    if (n < 0) {
-        PyErr_SetString(PyExc_ValueError, "n must be >= 0");
-        return NULL;
-    }
     result = PyTuple_New(n);
     if (result == NULL)
         return NULL;
@@ -2255,7 +2251,7 @@ typedef struct {
 @classmethod
 itertools.combinations.__new__
     iterable: object
-    r: Py_ssize_t
+    r: Py_ssize_t(allow_negative=False)
 Return successive r-length combinations of elements in the iterable.
 
 combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)
@@ -2264,7 +2260,7 @@ combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)
 static PyObject *
 itertools_combinations_impl(PyTypeObject *type, PyObject *iterable,
                             Py_ssize_t r)
-/*[clinic end generated code: output=87a689b39c40039c input=06bede09e3da20f8]*/
+/*[clinic end generated code: output=87a689b39c40039c input=a32f07a15cfa4676]*/
 {
     combinationsobject *co;
     Py_ssize_t n;
@@ -2276,10 +2272,6 @@ itertools_combinations_impl(PyTypeObject *type, PyObject *iterable,
     if (pool == NULL)
         goto error;
     n = PyTuple_GET_SIZE(pool);
-    if (r < 0) {
-        PyErr_SetString(PyExc_ValueError, "r must be non-negative");
-        goto error;
-    }
 
     indices = PyMem_New(Py_ssize_t, r);
     if (indices == NULL) {
@@ -2510,7 +2502,7 @@ typedef struct {
 @classmethod
 itertools.combinations_with_replacement.__new__
     iterable: object
-    r: Py_ssize_t
+    r: Py_ssize_t(allow_negative=False)
 Return successive r-length combinations of elements in the iterable allowing individual elements to have successive repeats.
 
 combinations_with_replacement('ABC', 2) --> ('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')
@@ -2520,7 +2512,7 @@ static PyObject *
 itertools_combinations_with_replacement_impl(PyTypeObject *type,
                                              PyObject *iterable,
                                              Py_ssize_t r)
-/*[clinic end generated code: output=48b26856d4e659ca input=26ebe0e42149e9fb]*/
+/*[clinic end generated code: output=48b26856d4e659ca input=828696750169e84f]*/
 {
     cwrobject *co;
     Py_ssize_t n;
@@ -2532,10 +2524,6 @@ itertools_combinations_with_replacement_impl(PyTypeObject *type,
     if (pool == NULL)
         goto error;
     n = PyTuple_GET_SIZE(pool);
-    if (r < 0) {
-        PyErr_SetString(PyExc_ValueError, "r must be non-negative");
-        goto error;
-    }
 
     indices = PyMem_New(Py_ssize_t, r);
     if (indices == NULL) {
index a1a1fc794fa5632d0a784514a4830cef07c93ecf..f7e721e52e11b034209142ad67e7b52a8aab1451 100644 (file)
@@ -12483,7 +12483,7 @@ os.copy_file_range
         Source file descriptor.
     dst: int
         Destination file descriptor.
-    count: Py_ssize_t
+    count: Py_ssize_t(allow_negative=False)
         Number of bytes to copy.
     offset_src: object = None
         Starting offset in src.
@@ -12499,7 +12499,7 @@ respectively for offset_dst.
 static PyObject *
 os_copy_file_range_impl(PyObject *module, int src, int dst, Py_ssize_t count,
                         PyObject *offset_src, PyObject *offset_dst)
-/*[clinic end generated code: output=1a91713a1d99fc7a input=42fdce72681b25a9]*/
+/*[clinic end generated code: output=1a91713a1d99fc7a input=08dacb760869b87c]*/
 {
     off_t offset_src_val, offset_dst_val;
     off_t *p_offset_src = NULL;
@@ -12511,11 +12511,6 @@ os_copy_file_range_impl(PyObject *module, int src, int dst, Py_ssize_t count,
     int flags = 0;
 
 
-    if (count < 0) {
-        PyErr_SetString(PyExc_ValueError, "negative value for 'count' not allowed");
-        return NULL;
-    }
-
     if (offset_src != Py_None) {
         if (!Py_off_t_converter(offset_src, &offset_src_val)) {
             return NULL;
@@ -12552,7 +12547,7 @@ os.splice
         Source file descriptor.
     dst: int
         Destination file descriptor.
-    count: Py_ssize_t
+    count: Py_ssize_t(allow_negative=False)
         Number of bytes to copy.
     offset_src: object = None
         Starting offset in src.
@@ -12572,7 +12567,7 @@ static PyObject *
 os_splice_impl(PyObject *module, int src, int dst, Py_ssize_t count,
                PyObject *offset_src, PyObject *offset_dst,
                unsigned int flags)
-/*[clinic end generated code: output=d0386f25a8519dc5 input=047527c66c6d2e0a]*/
+/*[clinic end generated code: output=d0386f25a8519dc5 input=034852a7b2e7af35]*/
 {
     off_t offset_src_val, offset_dst_val;
     off_t *p_offset_src = NULL;
@@ -12580,10 +12575,6 @@ os_splice_impl(PyObject *module, int src, int dst, Py_ssize_t count,
     Py_ssize_t ret;
     int async_err = 0;
 
-    if (count < 0) {
-        PyErr_SetString(PyExc_ValueError, "negative value for 'count' not allowed");
-        return NULL;
-    }
 
     if (offset_src != Py_None) {
         if (!Py_off_t_converter(offset_src, &offset_src_val)) {
@@ -15196,7 +15187,7 @@ exit:
 @permit_long_summary
 os.urandom
 
-    size: Py_ssize_t
+    size: Py_ssize_t(allow_negative=False)
     /
 
 Return a bytes object containing random bytes suitable for cryptographic use.
@@ -15204,14 +15195,11 @@ Return a bytes object containing random bytes suitable for cryptographic use.
 
 static PyObject *
 os_urandom_impl(PyObject *module, Py_ssize_t size)
-/*[clinic end generated code: output=42c5cca9d18068e9 input=ade19e6b362e7388]*/
+/*[clinic end generated code: output=42c5cca9d18068e9 input=58a0def87dbc2c22]*/
 {
     PyObject *bytes;
     int result;
 
-    if (size < 0)
-        return PyErr_Format(PyExc_ValueError,
-                            "negative argument not allowed");
     bytes = PyBytes_FromStringAndSize(NULL, size);
     if (bytes == NULL)
         return NULL;
index de4bf09b8e7e0b6640fbf5c7eb68cb3932f1aefb..47fe5e57e6ddd99108c5aec846dad519ac2a0f03 100644 (file)
@@ -471,10 +471,7 @@ SHA3_TYPE_SPEC(sha3_512_spec, "sha3_512", sha3_512_slots);
 static int
 sha3_shake_check_digest_length(Py_ssize_t length)
 {
-    if (length < 0) {
-        PyErr_SetString(PyExc_ValueError, "negative digest length");
-        return -1;
-    }
+    assert(length >= 0);
     if ((size_t)length >= (1 << 29)) {
         /*
          * Raise OverflowError to match the semantics of OpenSSL SHAKE
@@ -491,14 +488,14 @@ sha3_shake_check_digest_length(Py_ssize_t length)
 /*[clinic input]
 _sha3.shake_128.digest
 
-    length: Py_ssize_t
+    length: Py_ssize_t(allow_negative=False)
 
 Return the digest value as a bytes object.
 [clinic start generated code]*/
 
 static PyObject *
 _sha3_shake_128_digest_impl(SHA3object *self, Py_ssize_t length)
-/*[clinic end generated code: output=6c53fb71a6cff0a0 input=be03ade4b31dd54c]*/
+/*[clinic end generated code: output=6c53fb71a6cff0a0 input=1160c9f86ae0f867]*/
 {
     if (sha3_shake_check_digest_length(length) < 0) {
         return NULL;
@@ -526,14 +523,14 @@ _sha3_shake_128_digest_impl(SHA3object *self, Py_ssize_t length)
 /*[clinic input]
 _sha3.shake_128.hexdigest
 
-    length: Py_ssize_t
+    length: Py_ssize_t(allow_negative=False)
 
 Return the digest value as a string of hexadecimal digits.
 [clinic start generated code]*/
 
 static PyObject *
 _sha3_shake_128_hexdigest_impl(SHA3object *self, Py_ssize_t length)
-/*[clinic end generated code: output=a27412d404f64512 input=0d84d05d7a8ccd37]*/
+/*[clinic end generated code: output=a27412d404f64512 input=ff06c9362949d2c8]*/
 {
     if (sha3_shake_check_digest_length(length) < 0) {
         return NULL;
index 049dc6690ed7d9d6c0d81bf2f50a020e549e620f..0625a6f8052b6c2d411348d616d4782215dbf762 100644 (file)
@@ -429,7 +429,7 @@ zlib.decompress
     /
     wbits: int(c_default="MAX_WBITS") = MAX_WBITS
         The window buffer size and container format.
-    bufsize: Py_ssize_t(c_default="DEF_BUF_SIZE") = DEF_BUF_SIZE
+    bufsize: Py_ssize_t(c_default="DEF_BUF_SIZE", allow_negative=False) = DEF_BUF_SIZE
         The initial output buffer size.
 
 Returns a bytes object containing the uncompressed data.
@@ -438,7 +438,7 @@ Returns a bytes object containing the uncompressed data.
 static PyObject *
 zlib_decompress_impl(PyObject *module, Py_buffer *data, int wbits,
                      Py_ssize_t bufsize)
-/*[clinic end generated code: output=77c7e35111dc8c42 input=a9ac17beff1f893f]*/
+/*[clinic end generated code: output=77c7e35111dc8c42 input=530077065b3a2233]*/
 {
     PyObject *return_value;
     Byte *ibuf;
@@ -450,10 +450,7 @@ zlib_decompress_impl(PyObject *module, Py_buffer *data, int wbits,
 
     zlibstate *state = get_zlib_state(module);
 
-    if (bufsize < 0) {
-        PyErr_SetString(PyExc_ValueError, "bufsize must be non-negative");
-        return NULL;
-    } else if (bufsize == 0) {
+    if (bufsize == 0) {
         bufsize = 1;
     }
 
@@ -879,7 +876,7 @@ zlib.Decompress.decompress
     data: Py_buffer
         The binary data to decompress.
     /
-    max_length: Py_ssize_t = 0
+    max_length: Py_ssize_t(allow_negative=False) = 0
         The maximum allowable length of the decompressed data.
         Unconsumed input data will be stored in
         the unconsumed_tail attribute.
@@ -894,7 +891,7 @@ Call the flush() method to clear these buffers.
 static PyObject *
 zlib_Decompress_decompress_impl(compobject *self, PyTypeObject *cls,
                                 Py_buffer *data, Py_ssize_t max_length)
-/*[clinic end generated code: output=b024a93c2c922d57 input=205667f8c387fce4]*/
+/*[clinic end generated code: output=b024a93c2c922d57 input=77de124bd2a2ecc0]*/
 {
     int err = Z_OK;
     Py_ssize_t ibuflen;
@@ -906,10 +903,7 @@ zlib_Decompress_decompress_impl(compobject *self, PyTypeObject *cls,
         return NULL;
 
     zlibstate *state = get_zlib_state(module);
-    if (max_length < 0) {
-        PyErr_SetString(PyExc_ValueError, "max_length must be non-negative");
-        return NULL;
-    } else if (max_length == 0) {
+    if (max_length == 0) {
         max_length = -1;
     }
 
index a236a32c091c4c61ec82af151d73db4558a7dd71..c88772030ec283d8096a38460c0370073c919a4c 100644 (file)
@@ -340,6 +340,11 @@ int_to_bytes(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *
                 goto exit;
             }
             length = ival;
+            if (length < 0) {
+                PyErr_SetString(PyExc_ValueError,
+                                "length cannot be negative");
+                goto exit;
+            }
         }
         if (!--noptargs) {
             goto skip_optional_pos;
@@ -485,4 +490,4 @@ int_is_integer(PyObject *self, PyObject *Py_UNUSED(ignored))
 {
     return int_is_integer_impl(self);
 }
-/*[clinic end generated code: output=d23f8ce5bdf08a30 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=e68f4e23ead3f649 input=a9049054013a1b77]*/
index 286afae4d7d9fff8b135c72617724cd90876447a..b612eabaab480d3ae63963e2f4a584a9f540e2d8 100644 (file)
@@ -6356,7 +6356,7 @@ int_as_integer_ratio_impl(PyObject *self)
 /*[clinic input]
 int.to_bytes
 
-    length: Py_ssize_t = 1
+    length: Py_ssize_t(allow_negative=False) = 1
         Length of bytes object to use.  An OverflowError is raised if the
         integer is not representable with the given number of bytes.  Default
         is length 1.
@@ -6378,7 +6378,7 @@ Return an array of bytes representing an integer.
 static PyObject *
 int_to_bytes_impl(PyObject *self, Py_ssize_t length, PyObject *byteorder,
                   int is_signed)
-/*[clinic end generated code: output=89c801df114050a3 input=a0103d0e9ad85c2b]*/
+/*[clinic end generated code: output=89c801df114050a3 input=66f9d0c20529b44f]*/
 {
     int little_endian;
     PyObject *bytes;
@@ -6395,12 +6395,6 @@ int_to_bytes_impl(PyObject *self, Py_ssize_t length, PyObject *byteorder,
         return NULL;
     }
 
-    if (length < 0) {
-        PyErr_SetString(PyExc_ValueError,
-                        "length argument must be non-negative");
-        return NULL;
-    }
-
     bytes = PyBytes_FromStringAndSize(NULL, length);
     if (bytes == NULL)
         return NULL;