Commit c589e975 by David Malcolm Committed by David Malcolm

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

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.

From-SVN: r232076
parent ce3e43d7
2016-01-05 David Malcolm <dmalcolm@redhat.com>
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.
2016-01-04 Jakub Jelinek <jakub@redhat.com> 2016-01-04 Jakub Jelinek <jakub@redhat.com>
Update copyright years. Update copyright years.
......
...@@ -38,7 +38,7 @@ extern cpp_options *cpp_opts; ...@@ -38,7 +38,7 @@ extern cpp_options *cpp_opts;
static bool static bool
get_visual_column (expanded_location exploc, get_visual_column (expanded_location exploc,
unsigned int *out, unsigned int *out,
unsigned int *first_nws = NULL) unsigned int *first_nws)
{ {
int line_len; int line_len;
const char *line = location_get_source_line (exploc.file, exploc.line, 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, ...@@ -329,12 +329,20 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
; ;
foo (); foo ();
^ DON'T WARN HERE ^ DON'T WARN HERE
#define emit
if (flag)
foo ();
emit bar ();
^ DON'T WARN HERE
*/ */
if (next_stmt_exploc.line > body_exploc.line) if (next_stmt_exploc.line > body_exploc.line)
{ {
/* Determine if GUARD_LOC and NEXT_STMT_LOC are aligned on the same /* Determine if GUARD_LOC and NEXT_STMT_LOC are aligned on the same
"visual column"... */ "visual column"... */
unsigned int next_stmt_vis_column; unsigned int next_stmt_vis_column;
unsigned int next_stmt_line_first_nws;
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_vis_column;
...@@ -343,7 +351,8 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo, ...@@ -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 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
it's not clear that it's meaningful to look at indentation. */ 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; return false;
if (!get_visual_column (body_exploc, if (!get_visual_column (body_exploc,
&body_vis_column, &body_vis_column,
...@@ -354,6 +363,17 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo, ...@@ -354,6 +363,17 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo,
&guard_line_first_nws)) &guard_line_first_nws))
return false; 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 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
......
2016-01-05 David Malcolm <dmalcolm@redhat.com>
PR c/69122
* c-c++-common/Wmisleading-indentation.c (pr69122): New function.
2016-01-05 Nathan Sidwell <nathan@acm.org> 2016-01-05 Nathan Sidwell <nathan@acm.org>
PR c++/58583 PR c++/58583
......
...@@ -891,3 +891,13 @@ fn_39 (void) ...@@ -891,3 +891,13 @@ fn_39 (void)
i++); i++);
foo (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
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