From 91db1aeb1e7ed6a56e4ab0504fd576b6bf21a294 Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Wed, 11 Jun 2008 17:21:38 -0700 Subject: [PATCH] Fix e_declarations.pyx, e_nogilfunctype.pyx, e_tempcast.pyx. All tests pass. --- Cython/Compiler/ExprNodes.py | 4 ++++ Cython/Compiler/PyrexTypes.py | 2 -- Cython/Compiler/Symtab.py | 8 ++++++-- tests/errors/e_declarations.pyx | 3 ++- tests/errors/e_nogilfunctype.pyx | 6 +++--- tests/errors/e_tempcast.pyx | 2 +- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 976af1ce..758de510 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -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 diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py index a8ff7980..320331d4 100644 --- a/Cython/Compiler/PyrexTypes.py +++ b/Cython/Compiler/PyrexTypes.py @@ -699,8 +699,6 @@ class CFuncType(CType): 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): diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py index 141c7c83..b74798d2 100644 --- a/Cython/Compiler/Symtab.py +++ b/Cython/Compiler/Symtab.py @@ -374,6 +374,10 @@ class Scope: 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 @@ class CClassScope(ClassScope): 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. diff --git a/tests/errors/e_declarations.pyx b/tests/errors/e_declarations.pyx index 333275b9..cd19eb32 100644 --- a/tests/errors/e_declarations.pyx +++ b/tests/errors/e_declarations.pyx @@ -5,7 +5,8 @@ cdef extern int ff()() cdef void f(): cdef void *p cdef int (*h)() - h = f + h = f # this is an error + h = 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 diff --git a/tests/errors/e_nogilfunctype.pyx b/tests/errors/e_nogilfunctype.pyx index 048f6522..57c8de3f 100644 --- a/tests/errors/e_nogilfunctype.pyx +++ b/tests/errors/e_nogilfunctype.pyx @@ -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' """ diff --git a/tests/errors/e_tempcast.pyx b/tests/errors/e_tempcast.pyx index dd6b2c9c..0a0f8b3a 100644 --- a/tests/errors/e_tempcast.pyx +++ b/tests/errors/e_tempcast.pyx @@ -1,4 +1,4 @@ -cdef object foo, blarg +cdef object blarg def foo(obj): cdef int *p -- 2.26.2