summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin <kevin.corre@base-echo.net>2019-05-09 16:00:24 +0200
committerEli Bendersky <eliben@users.noreply.github.com>2019-05-09 07:00:24 -0700
commitf3a7cda31fc663a9ff6d1122e43999771f411df2 (patch)
treeac1af008142a91720b2fcfce7caeb3b83ec52700
parent1c6fbab46ef9ef1397a66391d5e5af0487fcaebd (diff)
downloadpycparser-f3a7cda31fc663a9ff6d1122e43999771f411df2.tar.gz
Fix issue #324: u/l constant integer suffix (#326)
-rw-r--r--pycparser/c_parser.py22
-rwxr-xr-xtests/test_c_parser.py18
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)