diff --git a/pycparser/c_generator.py b/pycparser/c_generator.py index 973d24a8..53c26fdf 100644 --- a/pycparser/c_generator.py +++ b/pycparser/c_generator.py @@ -59,17 +59,18 @@ def visit_FuncCall(self, n): return fref + '(' + self.visit(n.args) + ')' def visit_UnaryOp(self, n): - operand = self._parenthesize_unless_simple(n.expr) - if n.op == 'p++': - return '%s++' % operand - elif n.op == 'p--': - return '%s--' % operand - elif n.op == 'sizeof': + if n.op == 'sizeof': # Always parenthesize the argument of sizeof since it can be # a name. return 'sizeof(%s)' % self.visit(n.expr) else: - return '%s%s' % (n.op, operand) + operand = self._parenthesize_unless_simple(n.expr) + if n.op == 'p++': + return '%s++' % operand + elif n.op == 'p--': + return '%s--' % operand + else: + return '%s%s' % (n.op, operand) def visit_BinaryOp(self, n): lval_str = self._parenthesize_if(n.left, diff --git a/tests/test_c_generator.py b/tests/test_c_generator.py index dd19a11a..159c763d 100644 --- a/tests/test_c_generator.py +++ b/tests/test_c_generator.py @@ -354,6 +354,13 @@ def test_ptr_decl(self): self.assertEqual(generator.visit(ast.ext[0].type.type.type), 'const int') + def test_nested_sizeof(self): + src = '1' + for _ in range(30): + src = 'sizeof(' + src + ')' + src = 'int x = ' + src + ';' + self._assert_ctoc_correct(src) + class TestCasttoC(unittest.TestCase): def _find_file(self, name):