https://github.com/python/cpython/commit/2ac738d325a6934e39fecb097f43d4d4ed97a2b9
commit: 2ac738d325a6934e39fecb097f43d4d4ed97a2b9
branch: main
author: M Bussonnier <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2025-11-12T20:50:08+05:30
summary:
gh-132657: add regression test for `PySet_Contains` with unhashable type
(#141411)
files:
M Modules/_testlimitedcapi/set.c
diff --git a/Modules/_testlimitedcapi/set.c b/Modules/_testlimitedcapi/set.c
index 35da5fa5f008e1..34ed6b1d60b5a4 100644
--- a/Modules/_testlimitedcapi/set.c
+++ b/Modules/_testlimitedcapi/set.c
@@ -155,6 +155,51 @@ test_frozenset_add_in_capi(PyObject *self, PyObject
*Py_UNUSED(obj))
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},
};
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]