Commit f020a6d2 authored by Robert Bradshaw's avatar Robert Bradshaw

cdef extern structs may be c++ classes, can refer to themselves

parent 779b34dd
...@@ -790,24 +790,25 @@ class CStructOrUnionDefNode(StatNode): ...@@ -790,24 +790,25 @@ class CStructOrUnionDefNode(StatNode):
self.entry.defined_in_pxd = 1 self.entry.defined_in_pxd = 1
for attr in self.attributes: for attr in self.attributes:
attr.analyse_declarations(env, scope) attr.analyse_declarations(env, scope)
for attr in scope.var_entries: if self.visibility != 'extern':
type = attr.type for attr in scope.var_entries:
while type.is_array: type = attr.type
type = type.base_type while type.is_array:
if type == self.entry.type:
error(attr.pos, "Struct cannot contain itself as a member.")
if self.typedef_flag:
while type.is_ptr:
type = type.base_type type = type.base_type
if type == self.entry.type: if type == self.entry.type:
need_typedef_indirection = True error(attr.pos, "Struct cannot contain itself as a member.")
if need_typedef_indirection and self.visibility != 'extern': if self.typedef_flag:
# C can't handle typedef structs that refer to themselves. while type.is_ptr:
struct_entry = self.entry type = type.base_type
cname = env.new_const_cname() if type == self.entry.type:
self.entry = env.declare_typedef(self.name, struct_entry.type, self.pos, cname = self.cname, visibility='ignore') need_typedef_indirection = True
struct_entry.type.typedef_flag = False if need_typedef_indirection:
struct_entry.cname = struct_entry.type.cname = env.new_const_cname() # C can't handle typedef structs that refer to themselves.
struct_entry = self.entry
cname = env.new_const_cname()
self.entry = env.declare_typedef(self.name, struct_entry.type, self.pos, cname = self.cname, visibility='ignore')
struct_entry.type.typedef_flag = False
struct_entry.cname = struct_entry.type.cname = env.new_const_cname()
def analyse_expressions(self, env): def analyse_expressions(self, env):
pass pass
......
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