[PATCH] PR c/66220: Fix false positive from -Wmisleading-indentation

Jeff Law law@redhat.com
Wed May 20 21:01:00 GMT 2015


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



More information about the Gcc-patches mailing list