public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Fix -Wmisleading-indentation false-positive
@ 2015-09-21 11:24 Patrick Palka
  2015-09-21 12:27 ` Bernd Schmidt
  0 siblings, 1 reply; 2+ messages in thread
From: Patrick Palka @ 2015-09-21 11:24 UTC (permalink / raw)
  To: gcc-patches; +Cc: Patrick Palka

This patch fixes the last remaining false-positive
-Wmisleading-indentation warning that is emitted against the sqlite
sources.

The problem is the following kind of code snippet:

    for (i = 0;
         i < 10;
         i++
    );
    foo (i);

which is an "interesting" coding style but it is not misleading, so the
heurisitic shouldn't trip over it.  I adjusted the heuristic (which only
applies when the body is a semicolon) to be more strict in one sense (we
no longer warn when the guard column lines up with the column of the
"next" statement like in the above snippet) and yet more relaxed in
another sense (we now warn when the guard column is greater than the
column of the "next" statement, see test case changes).

Tested by compiling Linux, sqlite and vim code bases with
-Wmisleading-indentation.  OK if bootstrap + regtest succeeds?

gcc/c-family/ChangeLog:

	* c-indentation.c (should_warn_for_misleading_indentation):
	Float out and consolidate the calls to get_visual_column that is
	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.
---
 gcc/c-family/c-indentation.c                       | 23 +++++++-------------
 .../c-c++-common/Wmisleading-indentation.c         | 25 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/gcc/c-family/c-indentation.c b/gcc/c-family/c-indentation.c
index dd35223..5316316 100644
--- a/gcc/c-family/c-indentation.c
+++ b/gcc/c-family/c-indentation.c
@@ -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))
diff --git a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
index 0d6d8d2..f61c182 100644
--- a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
+++ b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
@@ -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);
 }
-- 
2.6.0.rc2.26.g0af4266.dirty

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] Fix -Wmisleading-indentation false-positive
  2015-09-21 11:24 [PATCH] Fix -Wmisleading-indentation false-positive Patrick Palka
@ 2015-09-21 12:27 ` Bernd Schmidt
  0 siblings, 0 replies; 2+ messages in thread
From: Bernd Schmidt @ 2015-09-21 12:27 UTC (permalink / raw)
  To: Patrick Palka, gcc-patches

On 09/21/2015 01:23 PM, Patrick Palka wrote:

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

Ok.


Bernd

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-09-21 12:21 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-21 11:24 [PATCH] Fix -Wmisleading-indentation false-positive Patrick Palka
2015-09-21 12:27 ` Bernd Schmidt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).