5f0bd3a
diff -U3 -r cython-0.29.17.orig/Cython/Compiler/ExprNodes.py cython-0.29.17/Cython/Compiler/ExprNodes.py
5f0bd3a
--- cython-0.29.17.orig/Cython/Compiler/ExprNodes.py	2020-04-26 13:48:48.000000000 +0200
5f0bd3a
+++ cython-0.29.17/Cython/Compiler/ExprNodes.py	2020-05-15 17:44:55.157172257 +0200
5f0bd3a
@@ -2295,8 +2295,10 @@
5f0bd3a
                 setter = 'PyDict_SetItem'
5f0bd3a
                 namespace = Naming.moddict_cname
5f0bd3a
             elif entry.is_pyclass_attr:
5f0bd3a
-                code.globalstate.use_utility_code(UtilityCode.load_cached("SetNameInClass", "ObjectHandling.c"))
5f0bd3a
-                setter = '__Pyx_SetNameInClass'
5f0bd3a
+                # Special-case setting __new__
5f0bd3a
+                n = "SetNewInClass" if self.name == "__new__" else "SetNameInClass"
5f0bd3a
+                code.globalstate.use_utility_code(UtilityCode.load_cached(n, "ObjectHandling.c"))
5f0bd3a
+                setter = '__Pyx_' + n
5f0bd3a
             else:
5f0bd3a
                 assert False, repr(entry)
5f0bd3a
             code.put_error_if_neg(
5f0bd3a
diff -U3 -r cython-0.29.17.orig/Cython/Compiler/Nodes.py cython-0.29.17/Cython/Compiler/Nodes.py
5f0bd3a
--- cython-0.29.17.orig/Cython/Compiler/Nodes.py	2020-04-26 13:48:48.000000000 +0200
5f0bd3a
+++ cython-0.29.17/Cython/Compiler/Nodes.py	2020-05-15 17:44:55.159172253 +0200
5f0bd3a
@@ -2872,7 +2872,6 @@
5f0bd3a
                 func = decorator.decorator
5f0bd3a
                 if func.is_name:
5f0bd3a
                     self.is_classmethod |= func.name == 'classmethod'
5f0bd3a
-                    self.is_staticmethod |= func.name == 'staticmethod'
5f0bd3a
 
5f0bd3a
         if self.is_classmethod and env.lookup_here('classmethod'):
5f0bd3a
             # classmethod() was overridden - not much we can do here ...
5f0bd3a
diff -U3 -r cython-0.29.17.orig/Cython/Utility/CythonFunction.c cython-0.29.17/Cython/Utility/CythonFunction.c
5f0bd3a
--- cython-0.29.17.orig/Cython/Utility/CythonFunction.c	2020-04-26 13:48:48.000000000 +0200
5f0bd3a
+++ cython-0.29.17/Cython/Utility/CythonFunction.c	2020-05-15 17:44:55.160172251 +0200
5f0bd3a
@@ -548,21 +548,6 @@
5f0bd3a
 
5f0bd3a
 static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type)
5f0bd3a
 {
5f0bd3a
-    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
5f0bd3a
-
5f0bd3a
-    if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
5f0bd3a
-        Py_INCREF(func);
5f0bd3a
-        return func;
5f0bd3a
-    }
5f0bd3a
-
5f0bd3a
-    if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) {
5f0bd3a
-        if (type == NULL)
5f0bd3a
-            type = (PyObject *)(Py_TYPE(obj));
5f0bd3a
-        return __Pyx_PyMethod_New(func, type, (PyObject *)(Py_TYPE(type)));
5f0bd3a
-    }
5f0bd3a
-
5f0bd3a
-    if (obj == Py_None)
5f0bd3a
-        obj = NULL;
5f0bd3a
     return __Pyx_PyMethod_New(func, obj, type);
5f0bd3a
 }
5f0bd3a
 
5f0bd3a
diff -U3 -r cython-0.29.17.orig/Cython/Utility/ObjectHandling.c cython-0.29.17/Cython/Utility/ObjectHandling.c
5f0bd3a
--- cython-0.29.17.orig/Cython/Utility/ObjectHandling.c	2020-04-26 13:48:48.000000000 +0200
5f0bd3a
+++ cython-0.29.17/Cython/Utility/ObjectHandling.c	2020-05-15 17:44:55.160172251 +0200
5f0bd3a
@@ -1163,6 +1163,30 @@
5f0bd3a
 #define __Pyx_SetNameInClass(ns, name, value)  PyObject_SetItem(ns, name, value)
5f0bd3a
 #endif
5f0bd3a
 
5f0bd3a
+/////////////// SetNewInClass.proto ///////////////
5f0bd3a
+
5f0bd3a
+static int __Pyx_SetNewInClass(PyObject *ns, PyObject *name, PyObject *value);
5f0bd3a
+
5f0bd3a
+/////////////// SetNewInClass ///////////////
5f0bd3a
+//@requires: SetNameInClass
5f0bd3a
+
5f0bd3a
+// Special-case setting __new__: if it's a Cython function, wrap it in a
5f0bd3a
+// staticmethod. This is similar to what Python does for a Python function
5f0bd3a
+// called __new__.
5f0bd3a
+static int __Pyx_SetNewInClass(PyObject *ns, PyObject *name, PyObject *value) {
5f0bd3a
+#ifdef __Pyx_CyFunction_USED
5f0bd3a
+    int ret;
5f0bd3a
+    if (__Pyx_CyFunction_Check(value)) {
5f0bd3a
+        PyObject *staticnew = PyStaticMethod_New(value);
5f0bd3a
+        if (unlikely(!staticnew)) return -1;
5f0bd3a
+        ret = __Pyx_SetNameInClass(ns, name, staticnew);
5f0bd3a
+        Py_DECREF(staticnew);
5f0bd3a
+        return ret;
5f0bd3a
+    }
5f0bd3a
+#endif
5f0bd3a
+    return __Pyx_SetNameInClass(ns, name, value);
5f0bd3a
+}
5f0bd3a
+
5f0bd3a
 
5f0bd3a
 /////////////// GetModuleGlobalName.proto ///////////////
5f0bd3a
 //@requires: PyDictVersioning
5f0bd3a
Only in cython-0.29.17.orig: cython-0.29.17
5f0bd3a
diff -U3 -r cython-0.29.17.orig/tests/run/cyfunction.pyx cython-0.29.17/tests/run/cyfunction.pyx
5f0bd3a
--- cython-0.29.17.orig/tests/run/cyfunction.pyx	2020-04-26 13:48:48.000000000 +0200
5f0bd3a
+++ cython-0.29.17/tests/run/cyfunction.pyx	2020-05-15 17:44:55.160172251 +0200
5f0bd3a
@@ -376,6 +376,18 @@
5f0bd3a
     def meth(self): pass
5f0bd3a
 
5f0bd3a
 
5f0bd3a
+class TestStaticmethod(object):
5f0bd3a
+    """
5f0bd3a
+    >>> x = TestStaticmethod()
5f0bd3a
+    >>> x.staticmeth(42)
5f0bd3a
+    42
5f0bd3a
+    >>> x.staticmeth.__get__(42)()
5f0bd3a
+    42
5f0bd3a
+    """
5f0bd3a
+    @staticmethod
5f0bd3a
+    def staticmeth(arg): return arg
5f0bd3a
+
5f0bd3a
+
5f0bd3a
 cdef class TestOptimisedBuiltinMethod:
5f0bd3a
     """
5f0bd3a
     >>> obj = TestOptimisedBuiltinMethod()
5f0bd3a
diff -U3 -r cython-0.29.17.orig/tests/run/fused_def.pyx cython-0.29.17/tests/run/fused_def.pyx
5f0bd3a
--- cython-0.29.17.orig/tests/run/fused_def.pyx	2020-04-26 13:48:48.000000000 +0200
5f0bd3a
+++ cython-0.29.17/tests/run/fused_def.pyx	2020-05-15 18:03:39.436752174 +0200
5f0bd3a
@@ -268,14 +268,6 @@
5f0bd3a
 def test_fused_def_super():
5f0bd3a
     """
5f0bd3a
     >>> test_fused_def_super()
5f0bd3a
-    long 10
5f0bd3a
-    long 11
5f0bd3a
-    long 11
5f0bd3a
-    long 12
5f0bd3a
-    short 12
5f0bd3a
-    long 13
5f0bd3a
-    short 13
5f0bd3a
-    long 14
5f0bd3a
     <class 'fused_def.SubClass'> long 14
5f0bd3a
     <class 'fused_def.SubClass'> long 15
5f0bd3a
     <class 'fused_def.SubClass'> long 15
5f0bd3a
@@ -296,11 +288,6 @@
5f0bd3a
     obj = SubClass()
5f0bd3a
     cls = SubClass
5f0bd3a
 
5f0bd3a
-    obj.mystaticmethod(obj, 10)
5f0bd3a
-    cls.mystaticmethod(obj, 11)
5f0bd3a
-    obj.mystaticmethod[cy.short](obj, 12)
5f0bd3a
-    cls.mystaticmethod[cy.short](obj, 13)
5f0bd3a
-
5f0bd3a
     obj.myclassmethod(14)
5f0bd3a
     cls.myclassmethod(15)
5f0bd3a
     obj.myclassmethod[cy.short](16)