diff mbox

Fix a -Wmisleading-indentation false-negative

Message ID 1442972247-21681-1-git-send-email-patrick@parcs.ath.cx
State New
Headers show

Commit Message

Patrick Palka Sept. 23, 2015, 1:37 a.m. UTC
We currently correctly emit a -Wmisleading-indentation warning for the
code

  ...
  if (flagB);
  {
    foo ();
  }

but we fail to emit a warning for the syntactically similar code

  ...
  else if (flagB);
  {
    foo ();
  }

because in the heuristic in question we are inspecting the column of the
guard token when we should rather be inspecting the column of the first
non-whitespace character on the guard line.  This patch adjusts the
heuristic accordingly, making it consistently use guard_line_first_nws.

Tested by building the linux, git, vim, sqlite and gdb-binutils sources
with -Wmisleading-indentation.  Is this OK after a bootstrap + regtest?

gcc/c-family/ChangeLog:

	* c-indentation.c (should_warn_for_misleading_indentation):
	Compare next_stmt_vis_column with guard_line_first_nws instead
	of with guard_line_vis_column.

gcc/testsuite/ChangeLog:

	* c-c++-common/Wmisleading-indentation.c: Augment test.
---
 gcc/c-family/c-indentation.c                         | 2 +-
 gcc/testsuite/c-c++-common/Wmisleading-indentation.c | 9 +++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

Comments

Bernd Schmidt Sept. 23, 2015, 8:53 a.m. UTC | #1
On 09/23/2015 03:37 AM, Patrick Palka wrote:

> gcc/c-family/ChangeLog:
>
> 	* c-indentation.c (should_warn_for_misleading_indentation):
> 	Compare next_stmt_vis_column with guard_line_first_nws instead
> 	of with guard_line_vis_column.
>
> gcc/testsuite/ChangeLog:
>
> 	* c-c++-common/Wmisleading-indentation.c: Augment test.

Ok.


Bernd
diff mbox

Patch

diff --git a/gcc/c-family/c-indentation.c b/gcc/c-family/c-indentation.c
index 5316316..5b119f7 100644
--- a/gcc/c-family/c-indentation.c
+++ b/gcc/c-family/c-indentation.c
@@ -464,7 +464,7 @@  should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
 	      {
 		if (next_stmt_vis_column > guard_line_first_nws
 		    || (next_tok_type == CPP_OPEN_BRACE
-			&& next_stmt_vis_column == guard_vis_column))
+			&& next_stmt_vis_column == guard_line_first_nws))
 		  return true;
 	      }
 	  }
diff --git a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
index f61c182..00c0a50 100644
--- a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
+++ b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
@@ -797,6 +797,15 @@  fn_37 (void)
        i++);
     foo (i); /* { dg-warning "statement is indented as if" } */
 
+  if (flagA)
+  {
+    foo (1);
+  }
+  else if (flagB); /* { dg-message "8: ...this 'if' clause" } */
+  { /* { dg-warning "statement is indented as if" } */
+    foo (2);
+  }
+
 #undef EMPTY
 #undef FOR_EACH
 }