[cfe-dev] Strange difference between Clang and GCC's -Wparentheses

Chandler Carruth chandlerc at gmail.com
Mon Jan 6 23:49:42 PST 2014


Currently Clang and GCC warn about:

(a || b && c)

Due to the very common mistake by programmers which ignores the relative
operator precedence of || and &&. This forces the user to place explicit
parentheses to group either (a || b) or (b && c) to be evaluated first.

However, GCC warns and Clang is silent about this:

(a || b && 1)

Worse, the same is true for:

(a || b && "foo")

Now, I find Clang's rationale seems somewhat reasonable: the grouping
doesn't change the truth table for this expression. However, I find this
clever interpretation problematic for several reasons:

1) It's a complex rule to teach programmers with dubious gains. This
exception doesn't realistically make the warning's false positives rare, it
just eliminates one common (but not the only common) pattern. On the flip
side, it is not a trivial rule to teach or predict for programmers. *Any*
constant that we can evaluate to true will satisfy this.

2) If the programmer expected the || to be evaluated first, they might well
also expect the "a" expression to be evaluated first and short circuiting
to take place. Even though the truth table is unimpacted, 'assert(!ptr ||
ptr->empty() && "foo");' can segfault, which I think might surprise users.

3) It makes it annoying to track warnings in both Clang and GCC. If you
mostly develop with Clang, but someone else checks out your code with GCC
it'll suddenly start warning (much like it just did in a recent commit.)


Thoughts? I'm happy to fix this, the change is trivial in SemaExpr.cpp, but
wanted to get some confirmation from Richard and Argyrios who have worked
on this warning that such a change would be OK.

-Chandler
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140107/1c1a13d8/attachment.html>


More information about the cfe-dev mailing list