darwin created this revision. darwin added a reviewer: clang-format. darwin added a project: clang-format. darwin requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
The AlignConsecutiveDeclarations option doesn't handle pointer properly: The expected code format: unsigned int* a; int* b; unsigned int Const* c; The actual code after formatting: unsigned int* a; int* b; unsigned int Const* c; >From the code of clang-format, it seems the WhitespaceManager miss treated >`Const` as one of the token and which leads to the faulty behavior. So I added >an extra check that if the next token is a pointer or a reference, then the >current token is not the aligned token (the `matcher` lambda returns false). Unit test passed: darwin@Darwins-iMac build % cmake --build . -j24 -t check-clang-unit ... [100%] Running lit suite /Volumes/silo/Projects/llvm-project/clang/test/Unit Testing Time: 270.81s Passed: 13848 [100%] Built target check-clang-unit Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D97137 Files: clang/lib/Format/WhitespaceManager.cpp clang/unittests/Format/FormatTest.cpp Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -13945,6 +13945,10 @@ verifyFormat("int oneTwoThree{0}; // comment\n" "unsigned oneTwo; // comment", Alignment); + verifyFormat("unsigned int * a;\n" + "int * b;\n" + "unsigned int Const *c;", + Alignment); EXPECT_EQ("float const a = 5;\n" "\n" "int oneTwoThree = 123;", @@ -14249,6 +14253,12 @@ 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;", + Alignment); } TEST_F(FormatTest, LinuxBraceBreaking) { Index: clang/lib/Format/WhitespaceManager.cpp =================================================================== --- clang/lib/Format/WhitespaceManager.cpp +++ clang/lib/Format/WhitespaceManager.cpp @@ -709,6 +709,8 @@ 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,
Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -13945,6 +13945,10 @@ verifyFormat("int oneTwoThree{0}; // comment\n" "unsigned oneTwo; // comment", Alignment); + verifyFormat("unsigned int * a;\n" + "int * b;\n" + "unsigned int Const *c;", + Alignment); EXPECT_EQ("float const a = 5;\n" "\n" "int oneTwoThree = 123;", @@ -14249,6 +14253,12 @@ 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;", + Alignment); } TEST_F(FormatTest, LinuxBraceBreaking) { Index: clang/lib/Format/WhitespaceManager.cpp =================================================================== --- clang/lib/Format/WhitespaceManager.cpp +++ clang/lib/Format/WhitespaceManager.cpp @@ -709,6 +709,8 @@ 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,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits