We are emitting a bogus warning for the code

  do foo (0); while (flagA);
              ^--- NEXT
     ^------------ BODY
  ^--------------- GUARD

In general I don't think we can get any useful indentation warning out
of a do-while statement, so this patch makes it so that we just skip
them.

Is this OK to commit after testing?

gcc/c-family/ChangeLog:

        * c-indentation.c (should_warn_for_misleading_indentation):
        Don't warn about do-while statements.

gcc/testsuite/ChangeLog:

        * c-c++-common/Wisleading-indentation.c: Augment test.
---
 gcc/c-family/c-indentation.c                         | 6 ++++++
 gcc/testsuite/c-c++-common/Wmisleading-indentation.c | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/gcc/c-family/c-indentation.c b/gcc/c-family/c-indentation.c
index 638a9cf..1cbaab7 100644
--- a/gcc/c-family/c-indentation.c
+++ b/gcc/c-family/c-indentation.c
@@ -202,6 +202,12 @@ should_warn_for_misleading_indentation (const 
token_indent_info &guard_tinfo,
   if (line_table->seen_line_directive)
     return false;
 
+  /* We can't usefully warn about do-while statements since the bodies of these
+     statements are always explicitly delimited at both ends, so control flow 
is
+     quite obvious.  */
+  if (guard_tinfo.keyword == RID_DO)
+    return false;
+
   /* If the token following the body is a close brace or an "else"
      then while indentation may be sloppy, there is not much ambiguity
      about control flow, e.g.
diff --git a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c 
b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
index a3f5acd..72c21a0 100644
--- a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
+++ b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
@@ -890,4 +890,6 @@ fn_39 (void)
        i < 10;
        i++);
   foo (i);
+
+  do foo (0); while (flagA);
 }
-- 
2.7.0.rc1.98.gacf58d0.dirty

Reply via email to