]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix PR c/69122 (-Wmisleading-indentation false positive with empty macros)
authorDavid Malcolm <dmalcolm@redhat.com>
Tue, 5 Jan 2016 15:54:46 +0000 (15:54 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Tue, 5 Jan 2016 15:54:46 +0000 (15:54 +0000)
gcc/c-family/ChangeLog:
PR c/69122
* c-indentation.c (get_visual_column): Remove default argument.
(should_warn_for_misleading_indentation): For the multiline case,
update call to get_visual_column for next_stmt_exploc so that it
captures the location of the first non-whitespace character in the
relevant line.  Don't issue warnings if there is non-whitespace
before the next statement.

gcc/testsuite/ChangeLog:
PR c/69122
* c-c++-common/Wmisleading-indentation.c (pr69122): New function.

From-SVN: r232076

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

index 6a4188b29dfc701c0837497d7d9e7fb633a76be3..7bae1a7649d46c9b2dac072e0bd36477b67bf433 100644 (file)
@@ -1,3 +1,13 @@
+2016-01-05  David Malcolm  <dmalcolm@redhat.com>
+
+       PR c/69122
+       * c-indentation.c (get_visual_column): Remove default argument.
+       (should_warn_for_misleading_indentation): For the multiline case,
+       update call to get_visual_column for next_stmt_exploc so that it
+       captures the location of the first non-whitespace character in the
+       relevant line.  Don't issue warnings if there is non-whitespace
+       before the next statement.
+
 2016-01-04  Jakub Jelinek  <jakub@redhat.com>
 
        Update copyright years.
index 2f857f7970912456c536d6530e5f5a9ecc730279..3c09336d15ab4984504b5bb39ad2efc759a43ce0 100644 (file)
@@ -38,7 +38,7 @@ extern cpp_options *cpp_opts;
 static bool
 get_visual_column (expanded_location exploc,
                   unsigned int *out,
-                  unsigned int *first_nws = NULL)
+                  unsigned int *first_nws)
 {
   int line_len;
   const char *line = location_get_source_line (exploc.file, exploc.line,
@@ -329,12 +329,20 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
          ;
          foo ();
          ^ DON'T WARN HERE
+
+       #define emit
+       if (flag)
+            foo ();
+       emit bar ();
+            ^ DON'T WARN HERE
+
   */
   if (next_stmt_exploc.line > body_exploc.line)
     {
       /* Determine if GUARD_LOC and NEXT_STMT_LOC are aligned on the same
         "visual column"...  */
       unsigned int next_stmt_vis_column;
+      unsigned int next_stmt_line_first_nws;
       unsigned int body_vis_column;
       unsigned int body_line_first_nws;
       unsigned int guard_vis_column;
@@ -343,7 +351,8 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
         the case for input files containing #line directives, and these
         are often for autogenerated sources (e.g. from .md files), where
         it's not clear that it's meaningful to look at indentation.  */
-      if (!get_visual_column (next_stmt_exploc, &next_stmt_vis_column))
+      if (!get_visual_column (next_stmt_exploc, &next_stmt_vis_column,
+                             &next_stmt_line_first_nws))
        return false;
       if (!get_visual_column (body_exploc,
                              &body_vis_column,
@@ -354,6 +363,17 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
                              &guard_line_first_nws))
        return false;
 
+      /* If the line where the next stmt starts has non-whitespace
+        on it before the stmt, then don't warn:
+         #define emit
+         if (flag)
+              foo ();
+         emit bar ();
+              ^ DON'T WARN HERE
+        (PR c/69122).  */
+      if (next_stmt_line_first_nws < next_stmt_vis_column)
+       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
index e231bbc719013743ddf7ebafa6202374fb86a151..9ff53ae6c1196699d20f4557f992cb8a22eafe04 100644 (file)
@@ -1,3 +1,8 @@
+2016-01-05  David Malcolm  <dmalcolm@redhat.com>
+
+       PR c/69122
+       * c-c++-common/Wmisleading-indentation.c (pr69122): New function.
+
 2016-01-05  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/58583
index a3f5acdd533e74389e376b059255878efec51a44..491291c171cca22f3a4f91618210166ecf0886a5 100644 (file)
@@ -891,3 +891,13 @@ fn_39 (void)
        i++);
   foo (i);
 }
+
+/* We shouldn't complain about the following function.  */
+#define emit
+void pr69122 (void)
+{
+  if (flagA)
+       foo (0);
+  emit foo (1);
+}
+#undef emit