diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py index bd5a74782dc5dce7bf82985bea3a7c77404d9d26..8cc1950b8ea7358134e0861a7664ba3d74fb9417 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,19 @@ 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) + + 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