aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilia Kond <emilia@rymiel.space>2024-01-22 14:57:37 +0200
committerGitHub <noreply@github.com>2024-01-22 14:57:37 +0200
commitfa6025e25b5754e8cf39169e3a7085b57ea35de5 (patch)
tree47d9f0363125e8a214a9485afa14fbd4a464b760
parent4821c90c24d52d4a42990fd9371caedb157bc58b (diff)
downloadllvm-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.cpp4
-rw-r--r--clang/unittests/Format/FormatTest.cpp12
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) {