Skip to content

Commit

Permalink
[clang-format] Fix AlignConsecutiveDeclarations handling of pointers
Browse files Browse the repository at this point in the history
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
  • Loading branch information
darwin-x authored and HazardyKnusperkeks committed Feb 27, 2021
1 parent 6f9dd84 commit e0b1df9
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
2 changes: 2 additions & 0 deletions clang/lib/Format/WhitespaceManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
46 changes: 46 additions & 0 deletions clang/unittests/Format/FormatTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;",
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit e0b1df9

Please sign in to comment.