From: Robert Bradshaw Date: Sun, 3 Aug 2008 06:35:16 +0000 (-0700) Subject: Function pointers as arguments, better errors for unnamed arguments. X-Git-Tag: 0.9.8.1~95^2~8 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=7e3e990f02956e0858d9ac29348533fc5c6b604b;p=cython.git Function pointers as arguments, better errors for unnamed arguments. --- diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index d06324c9..2b4d069a 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -362,8 +362,13 @@ class CNameDeclaratorNode(CDeclaratorNode): def analyse(self, base_type, env, nonempty = 0): if nonempty and self.name == '': - # Must have mistaken the name for the type. - self.name = base_type.name + raise RuntimeError + # May have mistaken the name for the type. + if base_type.is_ptr or base_type.is_array or base_type.is_buffer: + error(self.pos, "Missing argument name.") + elif base_type.is_void: + error(self.pos, "Use spam() rather than spam(void) to declare a function with no arguments.") + self.name = base_type.declaration_code("", for_display=1, pyrex=1) base_type = py_object_type self.type = base_type return self, base_type @@ -424,7 +429,7 @@ class CFuncDeclaratorNode(CDeclaratorNode): def analyse(self, return_type, env, nonempty = 0): func_type_args = [] for arg_node in self.args: - name_declarator, type = arg_node.analyse(env, nonempty = nonempty) + name_declarator, type = arg_node.analyse(env) name = name_declarator.name if name_declarator.cname: error(self.pos, diff --git a/tests/compile/cargdef.pyx b/tests/compile/cargdef.pyx index c8064d0b..c5da39bb 100644 --- a/tests/compile/cargdef.pyx +++ b/tests/compile/cargdef.pyx @@ -1,3 +1,10 @@ def f(obj, int i, float f, char *s1, char s2[]): pass - \ No newline at end of file + +cdef g(obj, int i, float f, char *s1, char s2[]): + pass + +cdef do_g(object (*func)(object, int, float, char*, char*)): + return func(1, 2, 3.14159, "a", "b") + +do_g(&g)