[clang-format] Don't confuse initializer equal signs in for loops (#77712)

clang-format has logic to align declarations of multiple variables of
the same type, aligning them at the equals sign. This logic is applied
in for loops as well. However, this alignment logic also erroneously
affected the equals signs of designated initializers.

This patch forbids alignment if the token 2 tokens back from the equals
sign is a designated initializer period.

Fixes https://github.com/llvm/llvm-project/issues/73902
This commit is contained in:
Emilia Kond
2024-01-22 14:57:37 +02:00
committed by GitHub
parent 4821c90c24
commit fa6025e25b
2 changed files with 15 additions and 1 deletions

View File

@@ -703,7 +703,9 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
if (Current.is(tok::equal) &&
(State.Line->First->is(tok::kw_for) || Current.NestingLevel == 0) &&
CurrentState.VariablePos == 0) {
CurrentState.VariablePos == 0 &&
(!Previous.Previous ||
Previous.Previous->isNot(TT_DesignatedInitializerPeriod))) {
CurrentState.VariablePos = State.Column;
// Move over * and & if they are bound to the variable name.
const FormatToken *Tok = &Previous;

View File

@@ -5008,6 +5008,18 @@ TEST_F(FormatTest, DesignatedInitializers) {
" [3] = cccccccccccccccccccccccccccccccccccccc,\n"
" [4] = dddddddddddddddddddddddddddddddddddddd,\n"
" [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
verifyFormat("for (const TestCase &test_case : {\n"
" TestCase{\n"
" .a = 1,\n"
" .b = 1,\n"
" },\n"
" TestCase{\n"
" .a = 2,\n"
" .b = 2,\n"
" },\n"
" }) {\n"
"}\n");
}
TEST_F(FormatTest, BracedInitializerIndentWidth) {