def analyse_types(self, env):
base_type = self.base_type.analyse(env)
_, self.type = self.declarator.analyse(base_type, env)
+ if self.type.is_cfunction:
+ error(self.pos,
+ "Cannot cast to a function type")
+ self.type = PyrexTypes.error_type
self.operand.analyse_types(env)
to_py = self.type.is_pyobject
from_py = self.operand.type.is_pyobject
return 0
if not self.same_calling_convention_as(other_type):
return 0
- if self.nogil != other_type.nogil:
- return 0
return 1
def compatible_signature_with(self, other_type, as_cmethod = 0):
def declare_pyfunction(self, name, pos):
# Add an entry for a Python function.
+ entry = self.lookup_here(name)
+ if entry:
+ # This is legal Python, but for now will produce invalid C.
+ error(pos, "'%s' already declared" % name)
entry = self.declare_var(name, py_object_type, pos)
entry.signature = pyfunction_signature
self.pyfunc_entries.append(entry)
if defining and entry.func_cname:
error(pos, "'%s' already defined" % name)
#print "CClassScope.declare_cfunction: checking signature" ###
- if type.same_c_signature_as(entry.type, as_cmethod = 1):
+ if type.same_c_signature_as(entry.type, as_cmethod = 1) and type.nogil == entry.type.nogil:
pass
- elif type.compatible_signature_with(entry.type, as_cmethod = 1):
+ elif type.compatible_signature_with(entry.type, as_cmethod = 1) and type.nogil == entry.type.nogil:
if type.optional_arg_count and not type.original_sig.optional_arg_count:
# Need to put a wrapper taking no optional arguments
# into the method table.
cdef void f():
cdef void *p
cdef int (*h)()
- h = <int ()()>f
+ h = <int ()()>f # this is an error
+ h = <int (*)()>f # this is OK
_ERRORS = u"""
/Local/Projects/D/Pyrex/Source/Tests/Errors3/e_declarations.pyx:1:19: Array element cannot be a function
/Local/Projects/D/Pyrex/Source/Tests/Errors3/e_declarations.pyx:2:18: Function cannot return an array
cdef extern from *:
- cdef void f() nogil
- cdef void (*fp)()
+ cdef void f()
+ cdef void (*fp)() nogil
fp = f
_ERRORS = u"""
-/Local/Projects/D/Pyrex/Source/Tests/Errors3/e_nogilfunctype.pyx:5:6: Cannot assign type 'void (void) nogil' to 'void (*)(void)'
+/Local/Projects/D/Pyrex/Source/Tests/Errors3/e_nogilfunctype.pyx:5:6: Cannot assign type 'void (void)' to 'void (*)(void) nogil'
"""