From: Patrick Palka Date: Tue, 22 Sep 2015 23:06:31 +0000 (+0000) Subject: Fix -Wmisleading-indentation false-positive X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d53980585be4b73f995d29a2ebd79f9729ec5e20;p=gcc.git 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 --- diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 381cb9230fc..e887735f58b 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,11 @@ +2015-09-22 Patrick Palka + + * 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 * c.opt (Wmultiple-inheritance, Wvirtual-inheritance, Wtemplates, diff --git a/gcc/c-family/c-indentation.c b/gcc/c-family/c-indentation.c index dd3522360b4..5316316da78 100644 --- a/gcc/c-family/c-indentation.c +++ b/gcc/c-family/c-indentation.c @@ -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)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 68eb33e37da..404b84cb0d6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-09-22 Patrick Palka + + * c-c++-common/Wmisleading-indentation.c: Augment test. + 2015-09-22 Nathan Sidwell * g++.dg/diagostic/disable.C: New. diff --git a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c index 0d6d8d2cc4e..f61c182c715 100644 --- a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c +++ b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c @@ -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); }