Issue #22995: Default implementation of __reduce__ and __reduce_ex__ now
rejects builtin types with not defined __new__.
diff --git a/Misc/NEWS b/Misc/NEWS
index 03aac95..e925103 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
Core and Builtins
-----------------
+- Issue #22995: Default implementation of __reduce__ and __reduce_ex__ now
+ rejects builtin types with not defined __new__.
+
- Issue #7267: format(int, 'c') now raises OverflowError when the argument is
not in range(0, 256).
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index d3e5384..720a84e 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -3214,6 +3214,13 @@
if (cls == NULL)
return NULL;
+ if (PyType_Check(cls) && ((PyTypeObject *)cls)->tp_new == NULL) {
+ PyErr_Format(PyExc_TypeError,
+ "can't pickle %s objects",
+ ((PyTypeObject *)cls)->tp_name);
+ return NULL;
+ }
+
getnewargs = PyObject_GetAttrString(obj, "__getnewargs__");
if (getnewargs != NULL) {
args = PyObject_CallObject(getnewargs, NULL);