aboutsummaryrefslogtreecommitdiff
path: root/pycparser
diff options
context:
space:
mode:
authoreli.bendersky <devnull@localhost>2011-02-10 07:05:13 +0200
committereli.bendersky <devnull@localhost>2011-02-10 07:05:13 +0200
commit697ecc5cc6a2be281edb41c591e8429a224dd8f3 (patch)
tree9df63bcd5fe3913823c1cb35b302835c55fde960 /pycparser
parent40d218b6689b96de224ffbe0bd1def7ee01ffd28 (diff)
downloadpycparser-697ecc5cc6a2be281edb41c591e8429a224dd8f3.tar.gz
Issue 19: Anonymous unions within struct cause parser error
Diffstat (limited to 'pycparser')
-rw-r--r--pycparser/c_parser.py50
1 files changed, 33 insertions, 17 deletions
diff --git a/pycparser/c_parser.py b/pycparser/c_parser.py
index d42e20f..26ac3e4 100644
--- a/pycparser/c_parser.py
+++ b/pycparser/c_parser.py
@@ -86,6 +86,7 @@ class CParser(PLYParser):
'specifier_qualifier_list',
'block_item_list',
'type_qualifier_list',
+ 'struct_declarator_list'
]
for rule in rules_with_opt:
@@ -645,29 +646,44 @@ class CParser(PLYParser):
p[0] = p[1] if len(p) == 2 else p[1] + p[2]
def p_struct_declaration_1(self, p):
- """ struct_declaration : specifier_qualifier_list struct_declarator_list SEMI
+ """ struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI
"""
spec = p[1]
decls = []
- for struct_decl in p[2]:
- if struct_decl['decl'] is not None:
- decl_coord = struct_decl['decl'].coord
- else:
- decl_coord = struct_decl['bitsize'].coord
+ if p[2] is not None:
+ for struct_decl in p[2]:
+ if struct_decl['decl'] is not None:
+ decl_coord = struct_decl['decl'].coord
+ else:
+ decl_coord = struct_decl['bitsize'].coord
- decl = c_ast.Decl(
- name=None,
- quals=spec['qual'],
- funcspec=spec['function'],
- storage=spec['storage'],
- type=struct_decl['decl'],
- init=None,
- bitsize=struct_decl['bitsize'],
- coord=decl_coord)
+ decl = c_ast.Decl(
+ name=None,
+ quals=spec['qual'],
+ funcspec=spec['function'],
+ storage=spec['storage'],
+ type=struct_decl['decl'],
+ init=None,
+ bitsize=struct_decl['bitsize'],
+ coord=decl_coord)
- typename = spec['type']
- decls.append(self._fix_decl_name_type(decl, typename))
+ typename = spec['type']
+ decls.append(self._fix_decl_name_type(decl, typename))
+
+ else: # anonymous struct/union, gcc extension, C1x feature
+ node = spec['type'][0]
+ if isinstance(node, c_ast.Union) or isinstance(node, c_ast.Struct):
+ decl = c_ast.Decl(
+ name=None,
+ quals=spec['qual'],
+ funcspec=spec['function'],
+ storage=spec['storage'],
+ type=node,
+ init=None,
+ bitsize=None,
+ coord=self._coord(p.lineno(2)))
+ decls.append(decl)
p[0] = decls