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>
* c.opt (Wmultiple-inheritance, Wvirtual-inheritance, Wtemplates,
......
......@@ -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))
......
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>
* g++.dg/diagostic/disable.C: New.
......
......@@ -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);
}
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