]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-132657: add regression test for `PySet_Contains` with unhashable type ...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 12 Nov 2025 15:42:18 +0000 (16:42 +0100)
committerGitHub <noreply@github.com>
Wed, 12 Nov 2025 15:42:18 +0000 (21:12 +0530)
gh-132657: add regression test for `PySet_Contains` with unhashable type (GH-141411)
(cherry picked from commit 2ac738d325a6934e39fecb097f43d4d4ed97a2b9)

Co-authored-by: M Bussonnier <bussonniermatthias@gmail.com>
Modules/_testlimitedcapi/set.c

index 35da5fa5f008e1cfca0fb1be5a70676ede3535cd..34ed6b1d60b5a4127b54b1e29741dc8df5563c81 100644 (file)
@@ -155,6 +155,51 @@ error:
     return NULL;
 }
 
+static PyObject *
+test_set_contains_does_not_convert_unhashable_key(PyObject *self, PyObject *Py_UNUSED(obj))
+{
+    // See https://docs.python.org/3/c-api/set.html#c.PySet_Contains
+    PyObject *outer_set = PySet_New(NULL);
+
+    PyObject *needle = PySet_New(NULL);
+    if (needle == NULL) {
+        Py_DECREF(outer_set);
+        return NULL;
+    }
+
+    PyObject *num = PyLong_FromLong(42);
+    if (num == NULL) {
+        Py_DECREF(outer_set);
+        Py_DECREF(needle);
+        return NULL;
+    }
+
+    if (PySet_Add(needle, num) < 0) {
+        Py_DECREF(outer_set);
+        Py_DECREF(needle);
+        Py_DECREF(num);
+        return NULL;
+    }
+
+    int result = PySet_Contains(outer_set, needle);
+
+    Py_DECREF(num);
+    Py_DECREF(needle);
+    Py_DECREF(outer_set);
+
+    if (result < 0) {
+        if (PyErr_ExceptionMatches(PyExc_TypeError)) {
+            PyErr_Clear();
+            Py_RETURN_NONE;
+        }
+        return NULL;
+    }
+
+    PyErr_SetString(PyExc_AssertionError,
+                    "PySet_Contains should have raised TypeError for unhashable key");
+    return NULL;
+}
+
 static PyMethodDef test_methods[] = {
     {"set_check", set_check, METH_O},
     {"set_checkexact", set_checkexact, METH_O},
@@ -174,6 +219,8 @@ static PyMethodDef test_methods[] = {
     {"set_clear", set_clear, METH_O},
 
     {"test_frozenset_add_in_capi", test_frozenset_add_in_capi, METH_NOARGS},
+    {"test_set_contains_does_not_convert_unhashable_key",
+     test_set_contains_does_not_convert_unhashable_key, METH_NOARGS},
 
     {NULL},
 };