Commit d5398058 by Patrick Palka

Fix -Wmisleading-indentation false-positive

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
parent 6c98d499
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> 2015-09-22 Nathan Sidwell <nathan@codesourcery.com>
* c.opt (Wmultiple-inheritance, Wvirtual-inheritance, Wtemplates, * c.opt (Wmultiple-inheritance, Wvirtual-inheritance, Wtemplates,
......
...@@ -341,6 +341,8 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo, ...@@ -341,6 +341,8 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
unsigned int next_stmt_vis_column; unsigned int next_stmt_vis_column;
unsigned int body_vis_column; unsigned int body_vis_column;
unsigned int body_line_first_nws; 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 /* If we can't determine it, don't issue a warning. This is sometimes
the case for input files containing #line directives, and these the case for input files containing #line directives, and these
are often for autogenerated sources (e.g. from .md files), where 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, ...@@ -351,6 +353,11 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
&body_vis_column, &body_vis_column,
&body_line_first_nws)) &body_line_first_nws))
return false; return false;
if (!get_visual_column (guard_exploc,
&guard_vis_column,
&guard_line_first_nws))
return false;
if ((body_type != CPP_SEMICOLON if ((body_type != CPP_SEMICOLON
&& next_stmt_vis_column == body_vis_column) && next_stmt_vis_column == body_vis_column)
/* As a special case handle the case where the body is a semicolon /* 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, ...@@ -365,7 +372,7 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
|| (body_type == CPP_SEMICOLON || (body_type == CPP_SEMICOLON
&& body_exploc.line > guard_exploc.line && body_exploc.line > guard_exploc.line
&& body_line_first_nws != body_vis_column && 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 /* Don't warn if they are aligned on the same column
as the guard itself (suggesting autogenerated code that doesn't 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, ...@@ -395,13 +402,6 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
indentation is misleading). Using the column of the first indentation is misleading). Using the column of the first
non-whitespace character on the guard line makes that non-whitespace character on the guard line makes that
happen. */ 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) if (guard_line_first_nws == body_vis_column)
return false; return false;
...@@ -462,13 +462,6 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo, ...@@ -462,13 +462,6 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
{ {
if (body_exploc.line == guard_exploc.line) 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 if (next_stmt_vis_column > guard_line_first_nws
|| (next_tok_type == CPP_OPEN_BRACE || (next_tok_type == CPP_OPEN_BRACE
&& next_stmt_vis_column == guard_vis_column)) && next_stmt_vis_column == guard_vis_column))
......
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> 2015-09-22 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/diagostic/disable.C: New. * g++.dg/diagostic/disable.C: New.
......
...@@ -732,6 +732,13 @@ fn_37 (void) ...@@ -732,6 +732,13 @@ fn_37 (void)
foo (0); foo (0);
} }
if (flagB) /* { dg-message "3: ...this 'if' clause" } */
/* blah */;
{ /* { dg-warning "statement is indented as if" } */
foo (0);
}
if (flagB) if (flagB)
; ;
else; foo (0); /* { dg-warning "statement is indented as if" } */ else; foo (0); /* { dg-warning "statement is indented as if" } */
...@@ -785,6 +792,11 @@ fn_37 (void) ...@@ -785,6 +792,11 @@ fn_37 (void)
else if (flagB); /* { dg-message "8: ...this 'if' clause" } */ else if (flagB); /* { dg-message "8: ...this 'if' clause" } */
foo (2); /* { dg-warning "statement is indented as if" } */ 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 EMPTY
#undef FOR_EACH #undef FOR_EACH
} }
...@@ -836,6 +848,12 @@ fn_38 (void) ...@@ -836,6 +848,12 @@ fn_38 (void)
if (flagB) if (flagB)
foo (2); foo (2);
foo (3); foo (3);
for (i = 0;
i < 10;
i++
);
foo (i);
} }
/* The following function contains good indentation which we definitely should /* The following function contains good indentation which we definitely should
...@@ -844,6 +862,8 @@ fn_38 (void) ...@@ -844,6 +862,8 @@ fn_38 (void)
void void
fn_39 (void) fn_39 (void)
{ {
int i;
if (flagA) if (flagA)
; ;
if (flagB) if (flagB)
...@@ -856,4 +876,9 @@ fn_39 (void) ...@@ -856,4 +876,9 @@ fn_39 (void)
foo (1); foo (1);
else else
foo (2); foo (2);
for (i = 0;
i < 10;
i++);
foo (i);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment