[clang] e0b1df9 - [clang-format] Fix AlignConsecutiveDeclarations handling of pointers
Björn Schäpers via cfe-commits
cfe-commits at lists.llvm.org
Sat Feb 27 13:57:29 PST 2021
Author: Darwin Xu
Date: 2021-02-27T22:56:36+01:00
New Revision: e0b1df924ae06d6d88582334087d2eacc6702e8f
URL: https://github.com/llvm/llvm-project/commit/e0b1df924ae06d6d88582334087d2eacc6702e8f
DIFF: https://github.com/llvm/llvm-project/commit/e0b1df924ae06d6d88582334087d2eacc6702e8f.diff
LOG: [clang-format] Fix AlignConsecutiveDeclarations handling of pointers
This is a bug fix of https://bugs.llvm.org/show_bug.cgi?id=49175
The expected code format:
unsigned int* a;
int* b;
unsigned int Const* c;
The actual code after formatting (without this patch):
unsigned int* a;
int* b;
unsigned int Const* c;
Differential Revision: https://reviews.llvm.org/D97137
Added:
Modified:
clang/lib/Format/WhitespaceManager.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/WhitespaceManager.cpp b/clang/lib/Format/WhitespaceManager.cpp
index 7d6964b7c72f..ac68fe0aa01a 100644
--- a/clang/lib/Format/WhitespaceManager.cpp
+++ b/clang/lib/Format/WhitespaceManager.cpp
@@ -709,6 +709,8 @@ void WhitespaceManager::alignConsecutiveDeclarations() {
for (FormatToken *Next = C.Tok->Next; Next; Next = Next->Next) {
if (Next->is(tok::comment))
continue;
+ if (Next->is(TT_PointerOrReference))
+ return false;
if (!Next->Tok.getIdentifierInfo())
break;
if (Next->isOneOf(TT_StartOfName, TT_FunctionDeclarationName,
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index b4b31fa70c10..8bb90e0d6e61 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -13945,6 +13945,20 @@ TEST_F(FormatTest, AlignConsecutiveDeclarations) {
verifyFormat("int oneTwoThree{0}; // comment\n"
"unsigned oneTwo; // comment",
Alignment);
+ verifyFormat("unsigned int * a;\n"
+ "int * b;\n"
+ "unsigned int Const *c;\n"
+ "unsigned int const *d;\n"
+ "unsigned int Const &e;\n"
+ "unsigned int const &f;",
+ Alignment);
+ verifyFormat("Const unsigned int *c;\n"
+ "const unsigned int *d;\n"
+ "Const unsigned int &e;\n"
+ "const unsigned int &f;\n"
+ "const unsigned g;\n"
+ "Const unsigned h;",
+ Alignment);
EXPECT_EQ("float const a = 5;\n"
"\n"
"int oneTwoThree = 123;",
@@ -14249,6 +14263,38 @@ TEST_F(FormatTest, AlignConsecutiveDeclarations) {
EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
"foo(int a);",
format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
+
+ Alignment.PointerAlignment = FormatStyle::PAS_Left;
+ verifyFormat("unsigned int* a;\n"
+ "int* b;\n"
+ "unsigned int Const* c;\n"
+ "unsigned int const* d;\n"
+ "unsigned int Const& e;\n"
+ "unsigned int const& f;",
+ Alignment);
+ verifyFormat("Const unsigned int* c;\n"
+ "const unsigned int* d;\n"
+ "Const unsigned int& e;\n"
+ "const unsigned int& f;\n"
+ "const unsigned g;\n"
+ "Const unsigned h;",
+ Alignment);
+
+ Alignment.PointerAlignment = FormatStyle::PAS_Middle;
+ verifyFormat("unsigned int * a;\n"
+ "int * b;\n"
+ "unsigned int Const * c;\n"
+ "unsigned int const * d;\n"
+ "unsigned int Const & e;\n"
+ "unsigned int const & f;",
+ Alignment);
+ verifyFormat("Const unsigned int * c;\n"
+ "const unsigned int * d;\n"
+ "Const unsigned int & e;\n"
+ "const unsigned int & f;\n"
+ "const unsigned g;\n"
+ "Const unsigned h;",
+ Alignment);
}
TEST_F(FormatTest, LinuxBraceBreaking) {
More information about the cfe-commits
mailing list