[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:
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user