From f3a7cda31fc663a9ff6d1122e43999771f411df2 Mon Sep 17 00:00:00 2001 From: Kevin Date: Thu, 9 May 2019 16:00:24 +0200 Subject: Fix issue #324: u/l constant integer suffix (#326) --- pycparser/c_parser.py | 22 +++++++++++++++++++++- tests/test_c_parser.py | 18 +++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/pycparser/c_parser.py b/pycparser/c_parser.py index 4e1889d..a32d0cc 100644 --- a/pycparser/c_parser.py +++ b/pycparser/c_parser.py @@ -1766,8 +1766,28 @@ class CParser(PLYParser): | INT_CONST_HEX | INT_CONST_BIN """ + uCount = 0 + lCount = 0 + for x in p[1][-3:]: + if x in ('l', 'L'): + lCount += 1 + elif x in ('u', 'U'): + uCount += 1 + t = '' + if uCount > 1: + raise ValueError('Constant cannot have more than one u/U suffix.') + elif lCount > 2: + raise ValueError('Constant cannot have more than two l/L suffix.') + else: + if uCount: + t += 'unsigned ' + if lCount == 1: + t += 'long ' + elif lCount == 2: + t += 'long long ' + t += 'int' p[0] = c_ast.Constant( - 'int', p[1], self._token_coord(p, 1)) + t, p[1], self._token_coord(p, 1)) def p_constant_2(self, p): """ constant : FLOAT_CONST diff --git a/tests/test_c_parser.py b/tests/test_c_parser.py index c09e04d..6cd183d 100755 --- a/tests/test_c_parser.py +++ b/tests/test_c_parser.py @@ -1262,6 +1262,22 @@ class TestCParser_fundamentals(TestCParser_base): self.assertEqual(self.get_decl_init(d55), ['Constant', 'float', '0xDE.38p0']) + d6 = 'int i = 1;' + self.assertEqual(self.get_decl_init(d6), + ['Constant', 'int', '1']) + + d61 = 'long int li = 1l;' + self.assertEqual(self.get_decl_init(d61), + ['Constant', 'long int', '1l']) + + d62 = 'unsigned int ui = 1u;' + self.assertEqual(self.get_decl_init(d62), + ['Constant', 'unsigned int', '1u']) + + d63 = 'unsigned long long int ulli = 1LLU;' + self.assertEqual(self.get_decl_init(d63), + ['Constant', 'unsigned long long int', '1LLU']) + def test_decl_named_inits(self): d1 = 'int a = {.k = 16};' self.assertEqual(self.get_decl_init(d1), @@ -1447,7 +1463,7 @@ class TestCParser_fundamentals(TestCParser_base): self.assertIsInstance(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.assertIsInstance(s1_ast.ext[1].body.block_items[2], Pragma) self.assertEqual(s1_ast.ext[1].body.block_items[2].string, 'baz') self.assertEqual(s1_ast.ext[1].body.block_items[2].coord.line, 6) -- cgit v1.2.1