summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Bendersky <eliben@gmail.com>2016-10-11 20:33:53 -0700
committerEli Bendersky <eliben@gmail.com>2016-10-11 20:33:53 -0700
commitb77d6c0d90d3f7c6dcc07efee15670492683f144 (patch)
tree4cb963f840e6d5058aba4b1f46773bdee6dcf370
parentf0e7954063b1414e0756dbb7a7056b4017e57c4e (diff)
downloadpycparser-b77d6c0d90d3f7c6dcc07efee15670492683f144.tar.gz
Issue #116: Fix line number assignment to EmptyStatement
-rw-r--r--pycparser/c_parser.py2
-rwxr-xr-xtests/test_c_parser.py24
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):