Permalink
Browse files

Fix e_declarations.pyx, e_nogilfunctype.pyx, e_tempcast.pyx. All test…

…s pass.
  • Loading branch information...
1 parent 1b7dd0b commit 91db1aeb1e7ed6a56e4ab0504fd576b6bf21a294 @robertwb robertwb committed Jun 12, 2008
@@ -2791,6 +2791,10 @@ class TypecastNode(ExprNode):
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
@@ -699,8 +699,6 @@ def same_c_signature_as_resolved_type(self, other_type, as_cmethod = 0):
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):
@@ -374,6 +374,10 @@ def declare_builtin(self, name, pos):
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)
@@ -1340,9 +1344,9 @@ def declare_cfunction(self, name, type, pos,
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.
@@ -5,7 +5,8 @@ cdef extern int ff()()
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
@@ -1,8 +1,8 @@
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'
"""
@@ -1,4 +1,4 @@
-cdef object foo, blarg
+cdef object blarg
def foo(obj):
cdef int *p

0 comments on commit 91db1ae

Please sign in to comment.