On 09/19/16 21:51, Jeff Law wrote:
> On 09/15/2016 03:19 AM, Bernd Edlinger wrote:
>> On 09/14/16 20:11, Jason Merrill wrote:
>>>> >>
>>>> >> Yes.  The reasoning I initially had was that it is completely
>>>> >> pointless to have something of the form "if (x ? 1 : 2)" or
>>>> >> "if (x ? 0 : 0)" because the result does not even depend on x
>>>> >> in this case.  But something like "if (x ? 4999 : 0)" looks
>>>> >> bogus but does at least not ignore x.
>>>> >>
>>>> >> If the false-positives are becoming too much of a problem here,
>>>> >> then I should of course revert to the previous heuristic again.
>>> >
>>> > I think we could have both, where the weaker form is part of -Wall and
>>> > people can explicitly select the stronger form.
>>> >
>>
>> Yes, agreed.  So here is what I would think will be the first version.
>>
>> It can later be extended to cover the more pedantic cases which
>> will not be enabled by -Wall.
>>
>> I would like to send a follow-up patch for the warning on
>> signed-integer shift left in boolean context, which I think
>> should also be good for Wall.
>> (I already had that feature in patch version 2 but that's meanwhile
>> outdated).
>>
>>
>> Bootstrap and reg-testing on x86_64-pc-linux-gnu.
>> Is it OK for trunk?
>>
>>
>> Thanks
>> Bernd.
>>
>>
>> changelog-pr77434v3.txt
>>
>>
>> gcc:
>> 2016-09-14  Bernd Edlinger  <bernd.edlin...@hotmail.de>
>>
>>     PR c++/77434
>>     * doc/invoke.texi: Document -Wcond-in-bool-context.
>>
>>     PR middle-end/77421
>>     * dwarf2out.c (output_loc_operands): Fix an assertion.
>>
>> c-family:
>> 2016-09-14  Bernd Edlinger  <bernd.edlin...@hotmail.de>
>>
>>     PR c++/77434
>>     * c.opt (Wcond-in-bool-context): New warning.
>>     * c-common.c (c_common_truthvalue_conversion): Warn on integer
>>     constants in boolean context.
>>
>> cp:
>> 2016-09-14  Bernd Edlinger  <bernd.edlin...@hotmail.de>
>>
>>     PR c++/77434
>>     * cvt.c (cp_convert_and_check): Suppress Wint-in-bool-context here.
>>
>> testsuite:
>> 2016-09-14  Bernd Edlinger  <bernd.edlin...@hotmail.de>
>>
>>     PR c++/77434
>>     * c-c++-common/Wcond-in-bool-context.c: New test.
>>
>>
>> patch-pr77434v3.diff
>>
>>
>> Index: gcc/builtins.c
>> ===================================================================
>> --- gcc/builtins.c    (revision 240135)
>> +++ gcc/builtins.c    (working copy)
>> @@ -7887,15 +7887,18 @@ fold_builtin_classify (location_t loc, tree
>> fndecl
>>          tree isinf_call = build_call_expr_loc (loc, isinf_fn, 1, arg);
>>
>>          signbit_call = fold_build2_loc (loc, NE_EXPR, integer_type_node,
>> -                    signbit_call, integer_zero_node);
>> +                        signbit_call, integer_zero_node);
>>          isinf_call = fold_build2_loc (loc, NE_EXPR, integer_type_node,
>> -                      isinf_call, integer_zero_node);
>> +                      isinf_call, integer_zero_node);
>>
>> -        tmp = fold_build3_loc (loc, COND_EXPR, integer_type_node,
>> signbit_call,
>> -                   integer_minus_one_node, integer_one_node);
>>          tmp = fold_build3_loc (loc, COND_EXPR, integer_type_node,
>> -                   isinf_call, tmp,
>> -                   integer_zero_node);
>> +                   signbit_call, integer_minus_one_node,
>> +                   integer_one_node);
>> +        /* Avoid a possible -Wint-in-bool-context warning in C.  */
>> +        tmp = fold_build2_loc (loc, PLUS_EXPR, integer_type_node, tmp,
>> +                   integer_zero_node);
>> +        tmp = fold_build3_loc (loc, COND_EXPR, integer_type_node,
>> +                   isinf_call, tmp, integer_zero_node);
>>        }
>>
>>      return tmp;
> This hunk is not mentioned in the ChangeLog and there's a good chance
> this has or is going to change significantly.  I don't like the tmp+0
> workaround either.  If there isn't an immediate need, can we let this
> hunk slide and come back to it after the other changes from Tamar &
> Wilco are wrapped up?
>

Yes that would be good.

> I think this is OK with the builtins.c hunk dropped as long as exclusion
> of that hunk doesn't trigger spurious warnings.
>

It does trigger a warning but it is usually masked by -Wsystem-headers,
so I initially missed it completely, but it comes quite often when
I build a recent glibc.  That does only happen with C, not C++.

If I drop that chunk then I must also drop that line

   if (__builtin_isinf_sign ((float)a/b)) /* { dg-bogus "boolean 
context" } */

But I have to come back and silence the warning on that construct
in a follow-up patch.


If it is OK, knowing it is work in progress,
I could hold back the builtins part for now,
and commit what I have ?


Thanks
Bernd.

Reply via email to