From 37f317c5bdef14f144146fb8c95b4858a5919dce Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Mon, 21 Nov 2016 14:24:03 -0600 Subject: [PATCH 1/2] C expression to code mapper: Parenthesize '&&' within '||' to avoid warnings from clang-based compilers. --- loopy/target/c/codegen/expression.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py index bd5a74782..e4845e425 100644 --- a/loopy/target/c/codegen/expression.py +++ b/loopy/target/c/codegen/expression.py @@ -685,6 +685,10 @@ class CExpressionToCodeMapper(RecursiveMapper): return f % tuple( self.rec(i, prec) for i in iterable) + def join(self, joiner, iterable): + f = joiner.join("%s" for i in iterable) + return f % tuple(iterable) + # }}} def map_constant(self, expr, prec): @@ -779,9 +783,16 @@ class CExpressionToCodeMapper(RecursiveMapper): enclosing_prec, PREC_LOGICAL_AND) def map_logical_or(self, expr, enclosing_prec): - return self.parenthesize_if_needed( - self.join_rec(" || ", expr.children, PREC_LOGICAL_OR), - enclosing_prec, PREC_LOGICAL_OR) + mapped_children = [] + from pymbolic.primitives import LogicalAnd + for child in expr.children: + mapped_child = self.rec(child, PREC_LOGICAL_OR) + # clang warns on unparenthesized && within || + if isinstance(child, LogicalAnd): + mapped_child = "(%s)" % mapped_child + mapped_children.append(mapped_child) + + return self.join(" || ", mapped_children) def map_sum(self, expr, enclosing_prec): from pymbolic.mapper.stringifier import PREC_SUM -- GitLab From 374d7dcd8d369e3bcd372f57a56120aeb7ecf40c Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Mon, 21 Nov 2016 15:19:17 -0600 Subject: [PATCH 2/2] map_logical_or: Respect enclosing precedence. --- loopy/target/c/codegen/expression.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py index e4845e425..8cc1950b8 100644 --- a/loopy/target/c/codegen/expression.py +++ b/loopy/target/c/codegen/expression.py @@ -792,7 +792,10 @@ class CExpressionToCodeMapper(RecursiveMapper): mapped_child = "(%s)" % mapped_child mapped_children.append(mapped_child) - return self.join(" || ", mapped_children) + result = self.join(" || ", mapped_children) + if enclosing_prec > PREC_LOGICAL_OR: + result = "(%s)" % result + return result def map_sum(self, expr, enclosing_prec): from pymbolic.mapper.stringifier import PREC_SUM -- GitLab