Commit 2cb09abc authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

Fix z.conjugate() for typedef-ed z; disallow external typedef complex

parent 77ec0cc4
...@@ -16,7 +16,7 @@ from Errors import error, warning, InternalError ...@@ -16,7 +16,7 @@ from Errors import error, warning, InternalError
import Naming import Naming
import PyrexTypes import PyrexTypes
import TypeSlots 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, \ from Symtab import ModuleScope, LocalScope, GeneratorLocalScope, \
StructOrUnionScope, PyClassScope, CClassScope StructOrUnionScope, PyClassScope, CClassScope
from Cython.Utils import open_new_file, replace_suffix from Cython.Utils import open_new_file, replace_suffix
......
...@@ -150,6 +150,15 @@ class PyrexType(BaseType): ...@@ -150,6 +150,15 @@ class PyrexType(BaseType):
# type information of the struct. # type information of the struct.
return 1 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): class CTypedefType(BaseType):
# #
# Pseudo-type defined with a ctypedef statement in a # Pseudo-type defined with a ctypedef statement in a
...@@ -170,6 +179,7 @@ class CTypedefType(BaseType): ...@@ -170,6 +179,7 @@ class CTypedefType(BaseType):
def __init__(self, cname, base_type, is_external=0): def __init__(self, cname, base_type, is_external=0):
assert not base_type.is_complex
self.typedef_cname = cname self.typedef_cname = cname
self.typedef_base_type = base_type self.typedef_base_type = base_type
self.typedef_is_external = is_external self.typedef_is_external = is_external
...@@ -876,8 +886,6 @@ class CComplexType(CNumericType): ...@@ -876,8 +886,6 @@ class CComplexType(CNumericType):
None, None,
visibility="extern") visibility="extern")
scope.parent_type = self scope.parent_type = self
scope.declare_var("real", self.real_type, None, "real", is_cdef=True) scope.declare_var("real", self.real_type, None, "real", is_cdef=True)
scope.declare_var("imag", self.real_type, None, "imag", is_cdef=True) scope.declare_var("imag", self.real_type, None, "imag", is_cdef=True)
entry = scope.declare_cfunction( entry = scope.declare_cfunction(
......
...@@ -342,7 +342,11 @@ class Scope(object): ...@@ -342,7 +342,11 @@ class Scope(object):
cname = name cname = name
else: else:
cname = self.mangle(Naming.type_prefix, name) 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) entry = self.declare_type(name, type, pos, cname, visibility)
type.qualified_name = entry.qualified_name type.qualified_name = entry.qualified_name
return entry return entry
......
...@@ -116,3 +116,8 @@ def test_conjugate(float complex z): ...@@ -116,3 +116,8 @@ def test_conjugate(float complex z):
def test_conjugate_double(double complex z): def test_conjugate_double(double complex z):
return z.conjugate() return z.conjugate()
ctypedef double complex cdouble
def test_conjugate_typedef(cdouble z):
return z.conjugate()
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