PR c/66220: Fix false positive from -Wmisleading-indentation
gcc/c-family/ChangeLog: PR c/66220: * c-indentation.c (should_warn_for_misleading_indentation): Use expand_location rather than expand_location_to_spelling_point. Don't warn if the guarding statement is more indented than the next/body stmts. gcc/testsuite/ChangeLog: PR c/66220: * c-c++-common/Wmisleading-indentation.c (fn_35): New. (fn_36): New. From-SVN: r224041
This commit is contained in:
parent
773ce42e90
commit
6ac481556e
@ -1,3 +1,11 @@
|
||||
2015-06-02 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
PR c/66220:
|
||||
* c-indentation.c (should_warn_for_misleading_indentation): Use
|
||||
expand_location rather than expand_location_to_spelling_point.
|
||||
Don't warn if the guarding statement is more indented than the
|
||||
next/body stmts.
|
||||
|
||||
2015-06-02 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
* c-indentation.c (warn_for_misleading_indentation): Bail out
|
||||
|
@ -230,10 +230,8 @@ should_warn_for_misleading_indentation (location_t guard_loc,
|
||||
if (next_tok_type == CPP_SEMICOLON)
|
||||
return false;
|
||||
|
||||
expanded_location body_exploc
|
||||
= expand_location_to_spelling_point (body_loc);
|
||||
expanded_location next_stmt_exploc
|
||||
= expand_location_to_spelling_point (next_stmt_loc);
|
||||
expanded_location body_exploc = expand_location (body_loc);
|
||||
expanded_location next_stmt_exploc = expand_location (next_stmt_loc);
|
||||
|
||||
/* They must be in the same file. */
|
||||
if (next_stmt_exploc.file != body_exploc.file)
|
||||
@ -257,8 +255,7 @@ should_warn_for_misleading_indentation (location_t guard_loc,
|
||||
^ DON'T WARN HERE. */
|
||||
if (next_stmt_exploc.line == body_exploc.line)
|
||||
{
|
||||
expanded_location guard_exploc
|
||||
= expand_location_to_spelling_point (guard_loc);
|
||||
expanded_location guard_exploc = expand_location (guard_loc);
|
||||
if (guard_exploc.file != body_exploc.file)
|
||||
return true;
|
||||
if (guard_exploc.line < body_exploc.line)
|
||||
@ -299,6 +296,15 @@ should_warn_for_misleading_indentation (location_t guard_loc,
|
||||
#endif
|
||||
bar ();
|
||||
^ DON'T WARN HERE
|
||||
|
||||
if (flag) {
|
||||
foo ();
|
||||
} else
|
||||
{
|
||||
bar ();
|
||||
}
|
||||
baz ();
|
||||
^ DON'T WARN HERE
|
||||
*/
|
||||
if (next_stmt_exploc.line > body_exploc.line)
|
||||
{
|
||||
@ -319,14 +325,18 @@ should_warn_for_misleading_indentation (location_t guard_loc,
|
||||
/* Don't warn if they aren't aligned on the same column
|
||||
as the guard itself (suggesting autogenerated code that
|
||||
doesn't bother indenting at all). */
|
||||
expanded_location guard_exploc
|
||||
= expand_location_to_spelling_point (guard_loc);
|
||||
expanded_location guard_exploc = expand_location (guard_loc);
|
||||
unsigned int guard_vis_column;
|
||||
if (!get_visual_column (guard_exploc, &guard_vis_column))
|
||||
return false;
|
||||
if (guard_vis_column == body_vis_column)
|
||||
return false;
|
||||
|
||||
/* PR 66220: Don't warn if the guarding statement is more
|
||||
indented than the next/body stmts. */
|
||||
if (guard_vis_column > body_vis_column)
|
||||
return false;
|
||||
|
||||
/* Don't warn if there is multiline preprocessor logic between
|
||||
the two statements. */
|
||||
if (detect_preprocessor_logic (body_exploc, next_stmt_exploc))
|
||||
|
@ -1,3 +1,9 @@
|
||||
2015-06-02 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
PR c/66220:
|
||||
* c-c++-common/Wmisleading-indentation.c (fn_35): New.
|
||||
(fn_36): New.
|
||||
|
||||
2015-06-02 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
|
||||
|
||||
PR c/49551
|
||||
|
@ -653,3 +653,41 @@ void fn_34_indent_linux_style(void)
|
||||
}
|
||||
foo(5);
|
||||
}
|
||||
|
||||
/* PR 66220. */
|
||||
int fn_35 (int v)
|
||||
{
|
||||
int res = 28;
|
||||
|
||||
if (v == 2)
|
||||
{
|
||||
res = 27;
|
||||
} else
|
||||
{
|
||||
res = 18;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/* This variant of K&R-style formatting (in the presence of conditional
|
||||
compilation) shouldn't lead to a warning.
|
||||
|
||||
Based on false positive seen with r223098 when compiling
|
||||
linux-4.0.3:arch/x86/crypto/aesni-intel_glue.c:aesni_init. */
|
||||
void
|
||||
fn_36 (void)
|
||||
{
|
||||
#if 1 /* e.g. some configuration variable. */
|
||||
if (flagA) {
|
||||
foo(0);
|
||||
foo(1);
|
||||
foo(2);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
foo(3);
|
||||
foo(4);
|
||||
foo(5);
|
||||
}
|
||||
foo(6); /* We shouldn't warn here. */
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user