diff mbox

Fix PR c/69122 (-Wmisleading-indentation false positive with empty macros)

Message ID 1451983382-12886-1-git-send-email-dmalcolm@redhat.com
State New
Headers show

Commit Message

David Malcolm Jan. 5, 2016, 8:43 a.m. UTC
Successfully bootstrapped&regrtested on x86_64-pc-linux-gnu.
OK for trunk?

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.
---
 gcc/c-family/c-indentation.c                       | 24 ++++++++++++++++++++--
 .../c-c++-common/Wmisleading-indentation.c         | 10 +++++++++
 2 files changed, 32 insertions(+), 2 deletions(-)

Comments

Bernd Schmidt Jan. 5, 2016, 12:27 p.m. UTC | #1
On 01/05/2016 09:43 AM, David Malcolm wrote:
> 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.

This is OK.


Bernd
diff mbox

Patch

diff --git a/gcc/c-family/c-indentation.c b/gcc/c-family/c-indentation.c
index 2f857f7..3c09336 100644
--- a/gcc/c-family/c-indentation.c
+++ b/gcc/c-family/c-indentation.c
@@ -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
diff --git a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
index a3f5acd..491291c 100644
--- a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
+++ b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
@@ -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