From: Dag Sverre Seljebotn Date: Tue, 20 Oct 2009 08:06:09 +0000 (+0200) Subject: Fix z.conjugate() for typedef-ed z; disallow external typedef complex X-Git-Tag: 0.13.beta0~2^2~121^2~3^2~4 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=2cb09abc30bf3c5f91e9ccc88e7d6a5107e48cca;p=cython.git Fix z.conjugate() for typedef-ed z; disallow external typedef complex --- diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 4e1e409a..40e40567 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -16,7 +16,7 @@ from Errors import error, warning, InternalError import Naming import PyrexTypes import TypeSlots -from PyrexTypes import py_object_type, error_type, CTypedefType, CFuncType +from PyrexTypes import py_object_type, error_type, CFuncType from Symtab import ModuleScope, LocalScope, GeneratorLocalScope, \ StructOrUnionScope, PyClassScope, CClassScope from Cython.Utils import open_new_file, replace_suffix diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py index 47182132..0a9ecbed 100644 --- a/Cython/Compiler/PyrexTypes.py +++ b/Cython/Compiler/PyrexTypes.py @@ -150,6 +150,15 @@ class PyrexType(BaseType): # type information of the struct. return 1 + +def create_typedef_type(cname, base_type, is_external=0): + if base_type.is_complex: + if is_external: + raise ValueError("Complex external typedefs not supported") + return base_type + else: + return CTypedefType(cname, base_type, is_external) + class CTypedefType(BaseType): # # Pseudo-type defined with a ctypedef statement in a @@ -170,6 +179,7 @@ class CTypedefType(BaseType): def __init__(self, cname, base_type, is_external=0): + assert not base_type.is_complex self.typedef_cname = cname self.typedef_base_type = base_type self.typedef_is_external = is_external @@ -876,8 +886,6 @@ class CComplexType(CNumericType): None, visibility="extern") scope.parent_type = self - - scope.declare_var("real", self.real_type, None, "real", is_cdef=True) scope.declare_var("imag", self.real_type, None, "imag", is_cdef=True) entry = scope.declare_cfunction( diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py index 892e985d..bb96dd45 100644 --- a/Cython/Compiler/Symtab.py +++ b/Cython/Compiler/Symtab.py @@ -342,7 +342,11 @@ class Scope(object): cname = name else: cname = self.mangle(Naming.type_prefix, name) - type = PyrexTypes.CTypedefType(cname, base_type, (visibility == 'extern')) + try: + type = PyrexTypes.create_typedef_type(cname, base_type, (visibility == 'extern')) + except ValueError, e: + error(pos, e.message) + type = PyrexTypes.error_type entry = self.declare_type(name, type, pos, cname, visibility) type.qualified_name = entry.qualified_name return entry diff --git a/tests/run/complex_numbers_T305.pyx b/tests/run/complex_numbers_T305.pyx index 71846397..e25a4b35 100644 --- a/tests/run/complex_numbers_T305.pyx +++ b/tests/run/complex_numbers_T305.pyx @@ -116,3 +116,8 @@ def test_conjugate(float complex z): def test_conjugate_double(double complex z): return z.conjugate() + +ctypedef double complex cdouble +def test_conjugate_typedef(cdouble z): + return z.conjugate() +