diff options
author | Emilia Kond <emilia@rymiel.space> | 2024-01-22 14:57:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-22 14:57:37 +0200 |
commit | fa6025e25b5754e8cf39169e3a7085b57ea35de5 (patch) | |
tree | 47d9f0363125e8a214a9485afa14fbd4a464b760 | |
parent | 4821c90c24d52d4a42990fd9371caedb157bc58b (diff) | |
download | llvm-fa6025e25b5754e8cf39169e3a7085b57ea35de5.zip llvm-fa6025e25b5754e8cf39169e3a7085b57ea35de5.tar.gz llvm-fa6025e25b5754e8cf39169e3a7085b57ea35de5.tar.bz2 |
[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
-rw-r--r-- | clang/lib/Format/ContinuationIndenter.cpp | 4 | ||||
-rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 12 |
2 files changed, 15 insertions, 1 deletions
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index e6eaaa9..ddbee15 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -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; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 3fb55ae..a0825dc 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -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) { |