Fix -Wmisleading-indentation false-positive
authorPatrick Palka <ppalka@gcc.gnu.org>
Tue, 22 Sep 2015 23:06:31 +0000 (23:06 +0000)
committerPatrick Palka <ppalka@gcc.gnu.org>
Tue, 22 Sep 2015 23:06:31 +0000 (23:06 +0000)
gcc/c-family/ChangeLog:

* c-indentation.c (should_warn_for_misleading_indentation):
Float out and consolidate the calls to get_visual_column that
are passed guard_exploc as an argument.  Compare
next_stmt_vis_column with guard_line_first_nws instead of with
body_line_first_nws.

gcc/testsuite/ChangeLog:

* c-c++-common/Wmisleading-indentation.c: Augment test.

From-SVN: r228027

gcc/c-family/ChangeLog
gcc/c-family/c-indentation.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Wmisleading-indentation.c

index 381cb9230fc2c15d9050aaef3c0fddedf505b7b5..e887735f58b972824541b7506e271a49958500dc 100644 (file)
@@ -1,3 +1,11 @@
+2015-09-22  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       * c-indentation.c (should_warn_for_misleading_indentation):
+       Float out and consolidate the calls to get_visual_column that
+       are passed guard_exploc as an argument.  Compare
+       next_stmt_vis_column with guard_line_first_nws instead of with
+       body_line_first_nws.
+
 2015-09-22  Nathan Sidwell  <nathan@codesourcery.com>
 
        * c.opt (Wmultiple-inheritance, Wvirtual-inheritance, Wtemplates,
index dd3522360b4a5c588a149f4339171eba0ad898fb..5316316da783f69f6be4b2ce471f18623bb1dbe7 100644 (file)
@@ -341,6 +341,8 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
       unsigned int next_stmt_vis_column;
       unsigned int body_vis_column;
       unsigned int body_line_first_nws;
+      unsigned int guard_vis_column;
+      unsigned int guard_line_first_nws;
       /* If we can't determine it, don't issue a warning.  This is sometimes
         the case for input files containing #line directives, and these
         are often for autogenerated sources (e.g. from .md files), where
@@ -351,6 +353,11 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
                              &body_vis_column,
                              &body_line_first_nws))
        return false;
+      if (!get_visual_column (guard_exploc,
+                             &guard_vis_column,
+                             &guard_line_first_nws))
+       return false;
+
       if ((body_type != CPP_SEMICOLON
           && next_stmt_vis_column == body_vis_column)
          /* As a special case handle the case where the body is a semicolon
@@ -365,7 +372,7 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
          || (body_type == CPP_SEMICOLON
              && body_exploc.line > guard_exploc.line
              && body_line_first_nws != body_vis_column
-             && next_stmt_vis_column == body_line_first_nws))
+             && next_stmt_vis_column > guard_line_first_nws))
        {
           /* Don't warn if they are aligned on the same column
             as the guard itself (suggesting autogenerated code that doesn't
@@ -395,13 +402,6 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
             indentation is misleading).  Using the column of the first
             non-whitespace character on the guard line makes that
             happen.  */
-         unsigned int guard_vis_column;
-         unsigned int guard_line_first_nws;
-         if (!get_visual_column (guard_exploc,
-                                 &guard_vis_column,
-                                 &guard_line_first_nws))
-           return false;
-
          if (guard_line_first_nws == body_vis_column)
            return false;
 
@@ -462,13 +462,6 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
          {
            if (body_exploc.line == guard_exploc.line)
              {
-               unsigned int guard_vis_column;
-               unsigned int guard_line_first_nws;
-               if (!get_visual_column (guard_exploc,
-                                       &guard_vis_column,
-                                       &guard_line_first_nws))
-                 return false;
-
                if (next_stmt_vis_column > guard_line_first_nws
                    || (next_tok_type == CPP_OPEN_BRACE
                        && next_stmt_vis_column == guard_vis_column))
index 68eb33e37da29873310321c5af91a990f4c800cb..404b84cb0d6dc63108441f90680d66e6f1726f3c 100644 (file)
@@ -1,3 +1,7 @@
+2015-09-22  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       * c-c++-common/Wmisleading-indentation.c: Augment test.
+
 2015-09-22  Nathan Sidwell  <nathan@codesourcery.com>
 
        * g++.dg/diagostic/disable.C: New.
index 0d6d8d2cc4eb87b5199c1f3949359db250716517..f61c182c715a970f880ec1205d07607ea48a018a 100644 (file)
@@ -732,6 +732,13 @@ fn_37 (void)
       foo (0);
     }
 
+  if (flagB) /* { dg-message "3: ...this 'if' clause" } */
+    /* blah */;
+   { /* { dg-warning "statement is indented as if" } */
+     foo (0);
+   }
+
+
   if (flagB)
     ;
   else; foo (0); /* { dg-warning "statement is indented as if" } */
@@ -785,6 +792,11 @@ fn_37 (void)
   else if (flagB); /* { dg-message "8: ...this 'if' clause" } */
     foo (2); /* { dg-warning "statement is indented as if" } */
 
+  for (i = 0; /* { dg-message "3: ...this 'for' clause" } */
+       i < 10;
+       i++);
+    foo (i); /* { dg-warning "statement is indented as if" } */
+
 #undef EMPTY
 #undef FOR_EACH
 }
@@ -836,6 +848,12 @@ fn_38 (void)
   if (flagB)
     foo (2);
   foo (3);
+
+  for (i = 0;
+       i < 10;
+       i++
+  );
+  foo (i);
 }
 
 /* The following function contains good indentation which we definitely should
@@ -844,6 +862,8 @@ fn_38 (void)
 void
 fn_39 (void)
 {
+  int i;
+
   if (flagA)
     ;
   if (flagB)
@@ -856,4 +876,9 @@ fn_39 (void)
       foo (1);
   else
     foo (2);
+
+  for (i = 0;
+       i < 10;
+       i++);
+  foo (i);
 }