summaryrefslogtreecommitdiff
path: root/gcc/c-family
diff options
context:
space:
mode:
authordmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>2016-01-05 15:54:46 +0000
committerdmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>2016-01-05 15:54:46 +0000
commitd42aa6198a400c3a3c5212bb15c5748ea3dc230c (patch)
tree1722ad395e726afbc91a2ce866781377c0ff8db4 /gcc/c-family
parent2d7d361d4903a1c3d4b496b7526b7784c45513f0 (diff)
downloadgcc-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/ChangeLog10
-rw-r--r--gcc/c-family/c-indentation.c24
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