Commit 91db1aeb authored by Robert Bradshaw's avatar Robert Bradshaw

Fix e_declarations.pyx, e_nogilfunctype.pyx, e_tempcast.pyx. All tests pass.

parent 1b7dd0ba
...@@ -2791,6 +2791,10 @@ class TypecastNode(ExprNode): ...@@ -2791,6 +2791,10 @@ class TypecastNode(ExprNode):
def analyse_types(self, env): def analyse_types(self, env):
base_type = self.base_type.analyse(env) base_type = self.base_type.analyse(env)
_, self.type = self.declarator.analyse(base_type, 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) self.operand.analyse_types(env)
to_py = self.type.is_pyobject to_py = self.type.is_pyobject
from_py = self.operand.type.is_pyobject from_py = self.operand.type.is_pyobject
......
...@@ -699,8 +699,6 @@ class CFuncType(CType): ...@@ -699,8 +699,6 @@ class CFuncType(CType):
return 0 return 0
if not self.same_calling_convention_as(other_type): if not self.same_calling_convention_as(other_type):
return 0 return 0
if self.nogil != other_type.nogil:
return 0
return 1 return 1
def compatible_signature_with(self, other_type, as_cmethod = 0): def compatible_signature_with(self, other_type, as_cmethod = 0):
......
...@@ -374,6 +374,10 @@ class Scope: ...@@ -374,6 +374,10 @@ class Scope:
def declare_pyfunction(self, name, pos): def declare_pyfunction(self, name, pos):
# Add an entry for a Python function. # 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 = self.declare_var(name, py_object_type, pos)
entry.signature = pyfunction_signature entry.signature = pyfunction_signature
self.pyfunc_entries.append(entry) self.pyfunc_entries.append(entry)
...@@ -1340,9 +1344,9 @@ class CClassScope(ClassScope): ...@@ -1340,9 +1344,9 @@ class CClassScope(ClassScope):
if defining and entry.func_cname: if defining and entry.func_cname:
error(pos, "'%s' already defined" % name) error(pos, "'%s' already defined" % name)
#print "CClassScope.declare_cfunction: checking signature" ### #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 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: if type.optional_arg_count and not type.original_sig.optional_arg_count:
# Need to put a wrapper taking no optional arguments # Need to put a wrapper taking no optional arguments
# into the method table. # into the method table.
......
...@@ -5,7 +5,8 @@ cdef extern int ff()() ...@@ -5,7 +5,8 @@ cdef extern int ff()()
cdef void f(): cdef void f():
cdef void *p cdef void *p
cdef int (*h)() cdef int (*h)()
h = <int ()()>f h = <int ()()>f # this is an error
h = <int (*)()>f # this is OK
_ERRORS = u""" _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: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 /Local/Projects/D/Pyrex/Source/Tests/Errors3/e_declarations.pyx:2:18: Function cannot return an array
......
cdef extern from *: cdef extern from *:
cdef void f() nogil cdef void f()
cdef void (*fp)() cdef void (*fp)() nogil
fp = f fp = f
_ERRORS = u""" _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'
""" """
cdef object foo, blarg cdef object blarg
def foo(obj): def foo(obj):
cdef int *p cdef int *p
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment