On Thu, Oct 29, 2015 at 1:35 PM, Patrick Palka <patr...@parcs.ath.cx> wrote:
> On Thu, Oct 29, 2015 at 12:49 PM, David Malcolm <dmalc...@redhat.com> 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 :)

Reply via email to