- Issue 4816: itertools.combinations() and itertools.product were raising
a ValueError for values of *r* larger than the input iterable. They now
correctly return an empty iterator.
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index 18a1229..5875d10 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -2059,10 +2059,6 @@
PyErr_SetString(PyExc_ValueError, "r must be non-negative");
goto error;
}
- if (r > n) {
- PyErr_SetString(PyExc_ValueError, "r cannot be bigger than the iterable");
- goto error;
- }
indices = PyMem_Malloc(r * sizeof(Py_ssize_t));
if (indices == NULL) {
@@ -2082,7 +2078,7 @@
co->indices = indices;
co->result = NULL;
co->r = r;
- co->stopped = 0;
+ co->stopped = r > n ? 1 : 0;
return (PyObject *)co;
@@ -2318,10 +2314,6 @@
PyErr_SetString(PyExc_ValueError, "r must be non-negative");
goto error;
}
- if (r > n) {
- PyErr_SetString(PyExc_ValueError, "r cannot be bigger than the iterable");
- goto error;
- }
indices = PyMem_Malloc(n * sizeof(Py_ssize_t));
cycles = PyMem_Malloc(r * sizeof(Py_ssize_t));
@@ -2345,7 +2337,7 @@
po->cycles = cycles;
po->result = NULL;
po->r = r;
- po->stopped = 0;
+ po->stopped = r > n ? 1 : 0;
return (PyObject *)po;