Function pointers as arguments, better errors for unnamed arguments.
authorRobert Bradshaw <robertwb@math.washington.edu>
Sun, 3 Aug 2008 06:35:16 +0000 (23:35 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Sun, 3 Aug 2008 06:35:16 +0000 (23:35 -0700)
Cython/Compiler/Nodes.py
tests/compile/cargdef.pyx

index d06324c9115c6086a2cd8dcf14daf7b0201be973..2b4d069ab87d1e9803b5e066425e5470f5b1858e 100644 (file)
@@ -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, 
index c8064d0bc64adab52250a231532a7b573dcd3a1b..c5da39bbe54e1fbb0d1d97f90442cb2ce559df58 100644 (file)
@@ -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)