diff options
author | eli.bendersky <devnull@localhost> | 2011-02-10 07:05:13 +0200 |
---|---|---|
committer | eli.bendersky <devnull@localhost> | 2011-02-10 07:05:13 +0200 |
commit | 697ecc5cc6a2be281edb41c591e8429a224dd8f3 (patch) | |
tree | 9df63bcd5fe3913823c1cb35b302835c55fde960 /pycparser | |
parent | 40d218b6689b96de224ffbe0bd1def7ee01ffd28 (diff) | |
download | pycparser-697ecc5cc6a2be281edb41c591e8429a224dd8f3.tar.gz |
Issue 19: Anonymous unions within struct cause parser error
Diffstat (limited to 'pycparser')
-rw-r--r-- | pycparser/c_parser.py | 50 |
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 |