diff options
author | Eli Bendersky <eliben@gmail.com> | 2016-10-11 20:33:53 -0700 |
---|---|---|
committer | Eli Bendersky <eliben@gmail.com> | 2016-10-11 20:33:53 -0700 |
commit | b77d6c0d90d3f7c6dcc07efee15670492683f144 (patch) | |
tree | 4cb963f840e6d5058aba4b1f46773bdee6dcf370 | |
parent | f0e7954063b1414e0756dbb7a7056b4017e57c4e (diff) | |
download | pycparser-b77d6c0d90d3f7c6dcc07efee15670492683f144.tar.gz |
Issue #116: Fix line number assignment to EmptyStatement
-rw-r--r-- | pycparser/c_parser.py | 2 | ||||
-rwxr-xr-x | tests/test_c_parser.py | 24 |
2 files changed, 16 insertions, 10 deletions
diff --git a/pycparser/c_parser.py b/pycparser/c_parser.py index cf062fb..71efa72 100644 --- a/pycparser/c_parser.py +++ b/pycparser/c_parser.py @@ -1427,7 +1427,7 @@ class CParser(PLYParser): def p_expression_statement(self, p): """ expression_statement : expression_opt SEMI """ if p[1] is None: - p[0] = c_ast.EmptyStatement(self._coord(p.lineno(1))) + p[0] = c_ast.EmptyStatement(self._coord(p.lineno(2))) else: p[0] = p[1] diff --git a/tests/test_c_parser.py b/tests/test_c_parser.py index 3adb62c..761d902 100755 --- a/tests/test_c_parser.py +++ b/tests/test_c_parser.py @@ -86,6 +86,11 @@ class TestCParser_base(unittest.TestCase): def setUp(self): self.cparser = _c_parser + def assert_coord(self, node, line, file=None): + self.assertEqual(node.coord.line, line) + if file: + self.assertEqual(node.coord.file, file) + class TestCParser_fundamentals(TestCParser_base): def get_decl(self, txt, index=0): @@ -125,11 +130,6 @@ class TestCParser_fundamentals(TestCParser_base): ['Decl', 'foo', ['TypeDecl', ['IdentifierType', ['int']]]]) - def assert_coord(self, node, line, file=None): - self.assertEqual(node.coord.line, line) - if file: - self.assertEqual(node.coord.file, file) - def test_coords(self): """ Tests the "coordinates" of parsed elements - file name and line numbers, with modification insterted by @@ -1338,7 +1338,7 @@ class TestCParser_fundamentals(TestCParser_base): self.assertTrue(isinstance(s1_ast.ext[1].body.block_items[0], Pragma)) self.assertEqual(s1_ast.ext[1].body.block_items[0].string, 'foo') self.assertEqual(s1_ast.ext[1].body.block_items[0].coord.line, 4) - + self.assertTrue(isinstance(s1_ast.ext[1].body.block_items[2], Pragma)) self.assertEqual(s1_ast.ext[1].body.block_items[2].string, '') self.assertEqual(s1_ast.ext[1].body.block_items[2].coord.line, 6) @@ -1538,16 +1538,22 @@ class TestCParser_whole_code(TestCParser_base): self.assert_num_ID_refs(ps3, 'a', 4) self.assert_all_Constants(ps3, ['0', '0', '1']) - def test_empty_statement(self): + def test_empty_statements(self): s1 = r''' void foo(void){ ; - return; + return;; + + ; } ''' ps1 = self.parse(s1) - self.assert_num_klass_nodes(ps1, EmptyStatement, 1) + self.assert_num_klass_nodes(ps1, EmptyStatement, 3) self.assert_num_klass_nodes(ps1, Return, 1) + self.assert_coord(ps1.ext[0].body.block_items[0], 3, '') + self.assert_coord(ps1.ext[0].body.block_items[1], 4, '') + self.assert_coord(ps1.ext[0].body.block_items[2], 4, '') + self.assert_coord(ps1.ext[0].body.block_items[3], 6, '') def test_switch_statement(self): def assert_case_node(node, const_value): |