FIx #252, bad C struct identifiers
authorRobert Bradshaw <robertwb@math.washington.edu>
Thu, 26 Mar 2009 05:33:50 +0000 (22:33 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Thu, 26 Mar 2009 05:33:50 +0000 (22:33 -0700)
Cython/Compiler/Symtab.py
tests/compile/bad_c_struct_T252.pyx [new file with mode: 0644]

index 58b57c85f4efb398c40a5a4524cbb5ef1bc077c6..6636dd1b7fb84bdbc05b45f88a6462739ef25bc7 100644 (file)
@@ -23,6 +23,19 @@ except NameError:
 possible_identifier = re.compile(ur"(?![0-9])\w+$", re.U).match
 nice_identifier = re.compile('^[a-zA-Z0-0_]+$').match
 
+ansi_c_keywords = set(
+['auto', 'break', 'case', 'char', 'const', 'continue', 'default', 'do', 
+    'double', 'else', 'enum', 'extern', 'float', 'for', 'goto', 'if', 
+    'int', 'long', 'register', 'return', 'short', 'signed', 'sizeof', 
+    'static', 'struct', 'switch', 'typedef', 'union', 'unsigned', 'void', 
+    'volatile', 'while'])
+
+def c_safe_identifier(cname):
+    # There are some C limitations on struct entry names. 
+    if cname[:2] == '__' or cname in ansi_c_keywords:
+        cname = Naming.pyrex_prefix + cname
+    return cname
+
 class BufferAux(object):
     writable_needed = False
     
@@ -1252,6 +1265,8 @@ class StructOrUnionScope(Scope):
         # Add an entry for an attribute.
         if not cname:
             cname = name
+            if visibility == 'private':
+                cname = c_safe_identifier(cname)
         if type.is_cfunction:
             type = PyrexTypes.CPtrType(type)
         entry = self.declare(name, cname, type, pos, visibility)
@@ -1387,6 +1402,8 @@ class CClassScope(ClassScope):
                         % name)
             if not cname:
                 cname = name
+                if visibility == 'private':
+                    cname = c_safe_identifier(cname)
             entry = self.declare(name, cname, type, pos, visibility)
             entry.is_variable = 1
             self.var_entries.append(entry)
diff --git a/tests/compile/bad_c_struct_T252.pyx b/tests/compile/bad_c_struct_T252.pyx
new file mode 100644 (file)
index 0000000..0f5b959
--- /dev/null
@@ -0,0 +1,8 @@
+cdef f(void=None):
+    pass
+
+cdef struct foo:
+    int void
+
+cdef class Foo:
+    cdef int void