diff options
author | dmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-01-05 15:54:46 +0000 |
---|---|---|
committer | dmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-01-05 15:54:46 +0000 |
commit | d42aa6198a400c3a3c5212bb15c5748ea3dc230c (patch) | |
tree | 1722ad395e726afbc91a2ce866781377c0ff8db4 /gcc/c-family | |
parent | 2d7d361d4903a1c3d4b496b7526b7784c45513f0 (diff) | |
download | gcc-d42aa6198a400c3a3c5212bb15c5748ea3dc230c.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@232076 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-family')
-rw-r--r-- | gcc/c-family/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/c-family/c-indentation.c | 24 |
2 files changed, 32 insertions, 2 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 6a4188b29df..7bae1a7649d 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,13 @@ +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> Update copyright years. diff --git a/gcc/c-family/c-indentation.c b/gcc/c-family/c-indentation.c index 2f857f79709..3c09336d15a 100644 --- a/gcc/c-family/c-indentation.c +++ b/gcc/c-family/c-indentation.c @@ -38,7 +38,7 @@ extern cpp_options *cpp_opts; static bool get_visual_column (expanded_location exploc, unsigned int *out, - unsigned int *first_nws = NULL) + unsigned int *first_nws) { int line_len; 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, ; foo (); ^ DON'T WARN HERE + + #define emit + if (flag) + foo (); + emit bar (); + ^ DON'T WARN HERE + */ if (next_stmt_exploc.line > body_exploc.line) { /* Determine if GUARD_LOC and NEXT_STMT_LOC are aligned on the same "visual column"... */ unsigned int next_stmt_vis_column; + unsigned int next_stmt_line_first_nws; unsigned int body_vis_column; unsigned int body_line_first_nws; unsigned int guard_vis_column; @@ -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 are often for autogenerated sources (e.g. from .md files), where 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; if (!get_visual_column (body_exploc, &body_vis_column, @@ -354,6 +363,17 @@ should_warn_for_misleading_indentation (const token_indent_info &guard_tinfo, &guard_line_first_nws)) 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 && next_stmt_vis_column == body_vis_column) /* As a special case handle the case where the body is a semicolon |