summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVitaly Cheptsov <4348897+vit9696@users.noreply.github.com>2021-10-05 15:37:49 +0300
committerGitHub <noreply@github.com>2021-10-05 05:37:49 -0700
commit82e1b6cb8faa8c4f0e9a57b3401a9b2a7afcc473 (patch)
treed93e89594f189be0c6b4d6229b34e201e169f78c
parent277c6066c8b76f084a238d28bd6193871eb0b74f (diff)
downloadpycparser-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.py5
-rw-r--r--pycparser/c_parser.py6
-rw-r--r--tests/c_files/c11.c1
-rw-r--r--tests/test_c_generator.py1
-rwxr-xr-xtests/test_c_parser.py7
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