The new heuristic turns out to trigger a common false positive (see test case below) in many programs. I have applied this diff on top of the original patch to make the heuristic more strict.
diff --git a/gcc/c-family/c-indentation.c b/gcc/c-family/c-indentation.c index d3e842b..5532ff4 100644 --- a/gcc/c-family/c-indentation.c +++ b/gcc/c-family/c-indentation.c @@ -390,7 +390,10 @@ should_warn_for_misleading_indentation (const common_token_info &guard_tinfo, unsigned int guard_vis_column; if (!get_visual_column (guard_exploc, &guard_vis_column)) return false; - if (next_stmt_vis_column != guard_vis_column + if (next_stmt_vis_column > guard_vis_column + || (guard_tinfo.keyword == RID_IF + && next_stmt_vis_column < guard_vis_column + && !is_first_nonwhitespace_on_line (guard_exploc)) || (next_tok_type == CPP_OPEN_BRACE && next_stmt_vis_column == guard_vis_column)) return true; diff --git a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c index e8e04e3..fd25102 100644 --- a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c +++ b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c @@ -787,6 +787,13 @@ fn_37 (void) foo (3); } + if (i) + while (i++ < 10000); + foo (5); + + if (i) while (i++ < 10000); + foo (5); + #undef EMPTY #undef FOR_EACH }