On 05/20/2015 11:05 AM, David Malcolm wrote:
This patch fixes the false positive seen from -Wmisleading-indentation
on this code:

     if (v == 2)
     {
         res = 27;
     } else
     {
         res = 18;
     }
     return res;
     ^ FALSE POSITIVE HERE

along with similar code seen when I tested it with linux-4.0.3.

The patch adds a reject for the case where the guard ("else" in
the above example) is more indented than the things it guards.

Doing so uncovered an issue with this testcase:

#define FOR_EACH(VAR, START, STOP) for ((VAR) = (START); (VAR) < (STOP); (VAR++)) /* { 
dg-message "36: ...this 'for' clause, but it is not" } */
void fn_15 (void)
{
   int i;
   FOR_EACH (i, 0, 10) /* { dg-message "3: in expansion of macro" } */
     foo (i);
     bar (i, i); /* { dg-warning "statement is indented as if it were guarded 
by..." } */
}
#undef FOR_EACH

which would then fail to report the warning, due to it using the
location of the "for" in the definition of macro FOR_EACH, rather than
the location of the FOR_EACH (i, 0, 10).  The fix for this is to use
expand_location to get file/line/col of each thing, rather than
expand_location_to_spelling_point.

With that, all testcases in Wmisleading-indentation.c pass (including
the new ones posted in
https://gcc.gnu.org/ml/gcc-patches/2015-05/msg01846.html ).

OK for trunk if it passes bootstrap&regrest?  (only tested with
   make check-gcc RUNTESTFLAGS="dg.exp=Wmisleading-indentation.c"
   make check-g++ RUNTESTFLAGS="dg.exp=Wmisleading-indentation.c"
so far)

gcc/c-family/ChangeLog:
        PR c/66220:
        * c-indentation.c (should_warn_for_misleading_indentation): Use
        expand_location rather than expand_location_to_spelling_point.
        Don't warn if the guarding statement is more indented than the
        next/body stmts.

gcc/testsuite/ChangeLog:
        PR c/66220:
        * c-c++-common/Wmisleading-indentation.c (fn_35): New.
        (fn_36): New.
OK.
jeff

Reply via email to