gh-132657: add regression test for PySet_Contains with unhashable type (#141411)

This commit is contained in:
M Bussonnier 2025-11-12 16:20:08 +01:00 committed by GitHub
parent 88aeff8eab
commit 2ac738d325
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -155,6 +155,51 @@ test_frozenset_add_in_capi(PyObject *self, PyObject *Py_UNUSED(obj))
return NULL; 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[] = { static PyMethodDef test_methods[] = {
{"set_check", set_check, METH_O}, {"set_check", set_check, METH_O},
{"set_checkexact", set_checkexact, METH_O}, {"set_checkexact", set_checkexact, METH_O},
@ -174,6 +219,8 @@ static PyMethodDef test_methods[] = {
{"set_clear", set_clear, METH_O}, {"set_clear", set_clear, METH_O},
{"test_frozenset_add_in_capi", test_frozenset_add_in_capi, METH_NOARGS}, {"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}, {NULL},
}; };