diff options
author | Vitaly Cheptsov <4348897+vit9696@users.noreply.github.com> | 2021-10-05 15:37:49 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-05 05:37:49 -0700 |
commit | 82e1b6cb8faa8c4f0e9a57b3401a9b2a7afcc473 (patch) | |
tree | d93e89594f189be0c6b4d6229b34e201e169f78c | |
parent | 277c6066c8b76f084a238d28bd6193871eb0b74f (diff) | |
download | pycparser-82e1b6cb8faa8c4f0e9a57b3401a9b2a7afcc473.tar.gz |
Implement C23 _Static_assert without message (#440)
Co-authored-by: vit9696 <vit9696@users.noreply.github.com>
-rw-r--r-- | pycparser/c_generator.py | 5 | ||||
-rw-r--r-- | pycparser/c_parser.py | 6 | ||||
-rw-r--r-- | tests/c_files/c11.c | 1 | ||||
-rw-r--r-- | tests/test_c_generator.py | 1 | ||||
-rwxr-xr-x | tests/test_c_parser.py | 7 |
5 files changed, 16 insertions, 4 deletions
diff --git a/pycparser/c_generator.py b/pycparser/c_generator.py index fdfe589..bbf1dd1 100644 --- a/pycparser/c_generator.py +++ b/pycparser/c_generator.py @@ -292,8 +292,9 @@ class CGenerator(object): def visit_StaticAssert(self, n): s = '_Static_assert(' s += self.visit(n.cond) - s += ',' - s += self.visit(n.message) + if n.message: + s += ',' + s += self.visit(n.message) s += ')' return s diff --git a/pycparser/c_parser.py b/pycparser/c_parser.py index 61e4471..1be11a4 100644 --- a/pycparser/c_parser.py +++ b/pycparser/c_parser.py @@ -560,8 +560,12 @@ class CParser(PLYParser): def p_static_assert_declaration(self, p): """ static_assert : _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPAREN + | _STATIC_ASSERT LPAREN constant_expression RPAREN """ - p[0] = [c_ast.StaticAssert(p[3], p[5], self._token_coord(p, 1))] + if len(p) == 5: + p[0] = [c_ast.StaticAssert(p[3], None, self._token_coord(p, 1))] + else: + p[0] = [c_ast.StaticAssert(p[3], p[5], self._token_coord(p, 1))] def p_pp_directive(self, p): """ pp_directive : PPHASH diff --git a/tests/c_files/c11.c b/tests/c_files/c11.c index 1c7ec08..ff11162 100644 --- a/tests/c_files/c11.c +++ b/tests/c_files/c11.c @@ -33,6 +33,7 @@ _Noreturn void func(void) int main() { _Static_assert(sizeof(flag) == sizeof(flag2), "Unexpected size difference"); + _Static_assert(sizeof(flag) == sizeof(flag2)); static_assert(sizeof(flag) == sizeof(flag2), "Unexpected size difference"); static_assert(sizeof(flag) == sizeof(flag3), "Unexpected size difference"); static_assert(sizeof(flag) == sizeof(flag4), "Unexpected size difference"); diff --git a/tests/test_c_generator.py b/tests/test_c_generator.py index a855e0b..4436a43 100644 --- a/tests/test_c_generator.py +++ b/tests/test_c_generator.py @@ -458,6 +458,7 @@ class TestCtoC(unittest.TestCase): def test_static_assert(self): self._assert_ctoc_correct('_Static_assert(sizeof(int) == sizeof(int), "123");') self._assert_ctoc_correct('int main() { _Static_assert(sizeof(int) == sizeof(int), "123"); } ') + self._assert_ctoc_correct('_Static_assert(sizeof(int) == sizeof(int));') def test_reduce_parentheses_binaryops(self): c1 = 'int x = a + b + c + d;'; diff --git a/tests/test_c_parser.py b/tests/test_c_parser.py index 5b9d916..e83bd7d 100755 --- a/tests/test_c_parser.py +++ b/tests/test_c_parser.py @@ -43,7 +43,10 @@ def expand_decl(decl): elif typ == Alignas: return ['Alignas', expand_init(decl.alignment)] elif typ == StaticAssert: - return ['StaticAssert', decl.cond.value, decl.message.value] + if decl.message: + return ['StaticAssert', decl.cond.value, decl.message.value] + else: + return ['StaticAssert', decl.cond.value] else: nested = expand_decl(decl.type) @@ -1644,11 +1647,13 @@ class TestCParser_fundamentals(TestCParser_base): int factorial(int p) { _Static_assert(2, "456"); + _Static_assert(3); } ''') self.assertEqual(expand_decl(f1.ext[0]), ['StaticAssert', '1', '"123"']) self.assertEqual(expand_decl(f1.ext[1].body.block_items[0]), ['StaticAssert', '2', '"456"']) + self.assertEqual(expand_decl(f1.ext[1].body.block_items[2]), ['StaticAssert', '3']) def test_unified_string_literals(self): # simple string, for reference |