summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOwen Pan <owenpiano@gmail.com>2019-05-01 18:23:44 +0000
committerOwen Pan <owenpiano@gmail.com>2019-05-01 18:23:44 +0000
commitc93a7477d59bf70daf83a5d8c32c65dcc9590388 (patch)
tree61bb2864a84102dececb6dfdd38a027ecbb3b5ea
parentfaa9d11b755b3e108b0bb2811f821fe3b6da8499 (diff)
[clang-format] Fix a bug in AlignConsecutiveDeclarations.
Fixes PR37175 Differential Revision: https://reviews.llvm.org/D61222 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@359711 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Format/WhitespaceManager.cpp18
-rw-r--r--unittests/Format/FormatTest.cpp7
2 files changed, 22 insertions, 3 deletions
diff --git a/lib/Format/WhitespaceManager.cpp b/lib/Format/WhitespaceManager.cpp
index 9f1ea7022f..5383addd7e 100644
--- a/lib/Format/WhitespaceManager.cpp
+++ b/lib/Format/WhitespaceManager.cpp
@@ -463,9 +463,21 @@ void WhitespaceManager::alignConsecutiveDeclarations() {
[](Change const &C) {
// tok::kw_operator is necessary for aligning operator overload
// definitions.
- return C.Tok->is(TT_StartOfName) ||
- C.Tok->is(TT_FunctionDeclarationName) ||
- C.Tok->is(tok::kw_operator);
+ if (C.Tok->isOneOf(TT_FunctionDeclarationName, tok::kw_operator))
+ return true;
+ if (C.Tok->isNot(TT_StartOfName))
+ return false;
+ // Check if there is a subsequent name that starts the same declaration.
+ for (FormatToken *Next = C.Tok->Next; Next; Next = Next->Next) {
+ if (Next->is(tok::comment))
+ continue;
+ if (!Next->Tok.getIdentifierInfo())
+ break;
+ if (Next->isOneOf(TT_StartOfName, TT_FunctionDeclarationName,
+ tok::kw_operator))
+ return false;
+ }
+ return true;
},
Changes, /*StartAt=*/0);
}
diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp
index fd61470d65..ade52c753c 100644
--- a/unittests/Format/FormatTest.cpp
+++ b/unittests/Format/FormatTest.cpp
@@ -10581,6 +10581,13 @@ TEST_F(FormatTest, AlignConsecutiveDeclarations) {
" unsigned c;\n"
"}",
Alignment);
+
+ // See PR37175
+ FormatStyle Style = getMozillaStyle();
+ Style.AlignConsecutiveDeclarations = true;
+ EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
+ "foo(int a);",
+ format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
}
TEST_F(FormatTest, LinuxBraceBreaking) {