cdef extern structs may be c++ classes, can refer to themselves
authorRobert Bradshaw <robertwb@math.washington.edu>
Wed, 26 Nov 2008 00:28:26 +0000 (16:28 -0800)
committerRobert Bradshaw <robertwb@math.washington.edu>
Wed, 26 Nov 2008 00:28:26 +0000 (16:28 -0800)
Cython/Compiler/Nodes.py

index 404b2c4ac9083376e933219e11af8266e4b941bd..a70f976ce0f2e9050a14971609c12bcacd9fea46 100644 (file)
@@ -790,24 +790,25 @@ class CStructOrUnionDefNode(StatNode):
                 self.entry.defined_in_pxd = 1
             for attr in self.attributes:
                 attr.analyse_declarations(env, scope)
-            for attr in scope.var_entries:
-                type = attr.type
-                while type.is_array:
-                    type = type.base_type
-                if type == self.entry.type:
-                    error(attr.pos, "Struct cannot contain itself as a member.")
-                if self.typedef_flag:
-                    while type.is_ptr:
+            if self.visibility != 'extern':
+                for attr in scope.var_entries:
+                    type = attr.type
+                    while type.is_array:
                         type = type.base_type
                     if type == self.entry.type:
-                        need_typedef_indirection = True
-        if need_typedef_indirection and self.visibility != 'extern':
-            # 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()
+                        error(attr.pos, "Struct cannot contain itself as a member.")
+                    if self.typedef_flag:
+                        while type.is_ptr:
+                            type = type.base_type
+                        if type == self.entry.type:
+                            need_typedef_indirection = True
+            if need_typedef_indirection:
+                # 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):
         pass