On 9/11/16, Manuel López-Ibáñez <lopeziba...@gmail.com> wrote:
> On 11/09/16 14:02, Mark Wielaard wrote:
>>   -Wshadow-local which warns if a local variable shadows another local
>>   variable or parameter,
>>
>>   -Wshadow-compatible-local which warns if a local variable shadows
>>   another local variable or parameter whose type is compatible with that
>>   of the shadowing variable.
>
> I honestly don't see the need for the second flag. Why not make Wshadow, or at
> least Wshadow-local, work in this way by default? Warning for shadowed
> variables that will nevertheless trigger errors/warnings if used wrongly
> seems not very useful anyway.
>
>


It helps for readability and helps pre-emptively catch those other
errors/warnings that come from using them wrongly before they occur in
a more confusing manner. Plus more granularity makes it easier to
manage the workload of warning-silencing.


>> +        /* If '-Wshadow-compatible-local' is specified without other
>> +           -Wshadow flags, we will warn only when the types of the
>> +           shadowing variable (i.e. new_decl) and the shadowed variable
>> +           (old_decl) are compatible.  */
>> +        if (comptypes (TREE_TYPE (old_decl), TREE_TYPE (new_decl)))
>> +          warning_code = OPT_Wshadow_compatible_local;
>> +        else
>> +          warning_code = OPT_Wshadow_local;
>> +        warned = warning (warning_code,
>> +                          "declaration of %q+D shadows a parameter",
>> +                          new_decl);
>
> Please don't use +D. Use warning_at with DECL_SOURCE_LOCATION(new_decl).
> See: https://gcc.gnu.org/wiki/DiagnosticsGuidelines#Locations
>
>
>> +              /* If '-Wshadow-compatible-local' is specified without other
>> +                 -Wshadow flags, we will warn only when the type of the
>> +                 shadowing variable (i.e. x) can be converted to that of
>> +                 the shadowed parameter (oldlocal). The reason why we only
>> +                 check if x's type can be converted to oldlocal's type
>> +                 (but not the other way around) is because when users
>> +                 accidentally shadow a parameter, more than often they
>> +                 would use the variable thinking (mistakenly) it's still
>> +                 the parameter. It would be rare that users would use the
>> +                 variable in the place that expects the parameter but
>> +                 thinking it's a new decl.  */
>
> As said above, IMHO, this behavior should be the default of -Wshadow, or at
> least, of -Wshadow-local. The current behavior only leads to people not
> using -Wshadow (and us not including it in -Wall -Wextra). There is a Linus 
> rant
> from some years ago that explains vehemently why Wshadow is useless in its
> current form.
>
>> +@item -Wshadow-compatible-local
>> +@opindex Wshadow-compatible-local
>> +@opindex Wno-shadow-compatible-local
>> +Warn when a local variable shadows another local variable or parameter
>> +whose type is compatible with that of the shadowing variable. In C++,
>> +type compatibility here means the type of the shadowing variable can be
>> +converted to that of the shadowed variable. The creation of this flag
>> +(in addition to @option{-Wshadow-local}) is based on the idea that when
>> +a local variable shadows another one of incompatible type, it is most
>> +likely intentional, not a bug or typo, as shown in the following
>> example:
>
> -Wshadow-compatible-local seems safe enough to be enabled by -Wall (or
> -Wextra). Options not enabled by either are rarely used (and, hence, rarely
> tested).
>
> Cheers,
>
> Manuel.
>


I see lots of GNU projects at least using the gnulib manywarnings.m4
autoconf macros in their configure script, and that enables a lot more
warnings than just -Wall and -Wextra. So I think the test coverage for
warnings outside of -Wall or -Wextra is better than you might think.

Reply via email to