On Thu, Oct 29, 2015 at 1:35 PM, Patrick Palka <[email protected]> wrote:
> On Thu, Oct 29, 2015 at 12:49 PM, David Malcolm <[email protected]> wrote:
>> Attempting to bootstrap gcc with -Wmisleading-indentation enabled I ran
>> into a few failures where the indentation, although bad, was arguably
>> not misleading.
>>
>> In regrename.c:scan_rtx_address:
>>
>> 1308 case PRE_MODIFY:
>> 1309 /* If the target doesn't claim to handle autoinc, this must be
>> 1310 something special, like a stack push. Kill this chain. */
>> 1311 if (!AUTO_INC_DEC)
>> 1312 action = mark_all_read;
>> 1313
>> 1314 break;
>> ^ this is indented at the same level as the "action =" code,
>> but clearly isn't guarded by the if () at line 1311.
>>
>> In gcc/fortran/io.c:gfc_match_open:
>>
>> 1997 {
>> 1998 static const char *delim[] = { "APOSTROPHE", "QUOTE",
>> "NONE", NULL };
>> 1999
>> 2000 if (!is_char_type ("DELIM", open->delim))
>> 2001 goto cleanup;
>> 2002
>> 2003 if (!compare_to_allowed_values ("DELIM", delim, NULL, NULL,
>> 2004
>> open->delim->value.character.string,
>> 2005 "OPEN", warn))
>> ^ this is indented with the "goto cleanup;" due to
>> lines 2000-2001 not being indented enough, but
>> line 2003 clearly isn't guarded by the
>> "if (!is_char_type" conditional.
>>
>> In gcc/function.c:locate_and_pad_parm:
>>
>> 4118 locate->slot_offset.constant = -initial_offset_ptr->constant;
>> 4119 if (initial_offset_ptr->var)
>> 4120 locate->slot_offset.var = size_binop (MINUS_EXPR, ssize_int
>> (0),
>> 4121
>> initial_offset_ptr->var);
>> 4122
>> 4123 {
>> 4124 tree s2 = sizetree;
>> 4125 if (where_pad != none
>> 4126 && (!tree_fits_uhwi_p (sizetree)
>> 4127 || (tree_to_uhwi (sizetree) * BITS_PER_UNIT) %
>> round_boundary))
>> 4128 s2 = round_up (s2, round_boundary / BITS_PER_UNIT);
>> 4129 SUB_PARM_SIZE (locate->slot_offset, s2);
>> 4130 }
>> ^ this block is not guarded by the
>> "if (initial_offset_ptr->var)"
>> and the whitespace line (4122) is likely to make a
>> human reader of the code read it that way also.
>>
>> In each case, a blank line separated the guarded code from followup code
>> that wasn't guarded, and to my eyes, the blank line makes the meaning of
>> the badly-indented code sufficiently clear that it seems unjustified to
>> issue a -Wmisleading-indentation warning.
>
> This makes sense to me.
>
> Though I've been thinking about proposing a simpler and more relaxed
> heuristic:
>
> if (next_stmt_exploc.line - body_exploc.line > 1)
> return false;
>
> That is, don't warn if there are any lines between the (start of the)
> body statement and the next statement.
>
> This would catch the presence of blank lines as well as code like:
>
> if (foo)
> bar (an_argument_1,
> an_argument_2);
> baz ();
>
> and
>
> if (foo)
> bar ();
> /* Some comment. */
> baz ();
>
> Though I am not confident that we should not warn in such cases. At
> this point whether some code is misleadingly indented or not becomes
> pretty subjective (so it may be better to not warn?)
However we should definitely not warn on
if (foo)
bar ();
{
baz ();
}
Since that is valid GNU-style code :)