https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77434

--- Comment #9 from Manuel López-Ibáñez <manu at gcc dot gnu.org> ---
(In reply to Eric Gallager from comment #8)
> As a user, I'd prefer warning about the missing parentheses instead of the
> boolean context thing, the missing parentheses make a lot more sense to me
> and it'd be easier for me to understand how to fix it, whereas the boolean
> context one is a bit more confusing.

It seems to me that they are two different warnings that could be triggered on
similar code. The one warned by the patch would also warn about:

if (a ? 1 : 2)

but not about 

   gcc_assert (die_offset > 0
         && die_offset <= (loc->dw_loc_opc == DW_OP_call2)
              ? 0
              : 0xffffffff);

nor:

   gcc_assert (die_offset > 0
         && die_offset <= (loc->dw_loc_opc == DW_OP_call2)
              ? n
              : 0xffffffff);

This is what clang emits for a similar case (for which GCC does not warn):

prog.cc:3:26: warning: operator '?:' has lower precedence than '<<'; '<<' will
be evaluated first [-Wparentheses]
   int n = a << (a == b) ? 1 :2;
           ~~~~~~~~~~~~~ ^
prog.cc:3:26: note: place parentheses around the '<<' expression to silence
this warning
   int n = a << (a == b) ? 1 :2;
                         ^
           (            )
prog.cc:3:26: note: place parentheses around the '?:' expression to evaluate it
first
   int n = a << (a == b) ? 1 :2;
                         ^
                (              )


Perhaps a middle-ground would be something like:

warning: operator '?:' has lower precedence than '=='; '==' will be evaluated
first and '?:' will evaluate to integers in boolean context [-Wparentheses]
if (a == b ? 1 : 2)
    ~~~~~~ ^
note: place parentheses around the '==' expression to silence this warning
if (a == b ? 1 : 2)
    ~~~~~~
    (a == b)
note: place parentheses around the '?:' expression to evaluate it first
if (a == b ? 1 : 2)
         ~~~~~~~~~
         (b ? 1 : 2)

Reply via email to