https://github.com/owenca updated https://github.com/llvm/llvm-project/pull/150744
>From 7418fe966ff3a3e9f3c6c431beafbdde47a1de30 Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Sat, 26 Jul 2025 01:56:52 -0700 Subject: [PATCH 1/3] [clang-format] Fix a bug in `DerivePointerAlignment: true` This effectively reverts a4d4859dc70c046ad928805ddeaf8fa101793394 which didn't fix the problem that `int*,` was not counted as "Left" alignment. Fixes #150327 --- clang/lib/Format/Format.cpp | 31 ++++++++++----------------- clang/unittests/Format/FormatTest.cpp | 7 +++++- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 1cfa3d1535902..01d2b4dfc76cc 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -2641,28 +2641,19 @@ class Formatter : public TokenAnalyzer { int AlignmentDiff = 0; for (const AnnotatedLine *Line : Lines) { AlignmentDiff += countVariableAlignments(Line->Children); - for (FormatToken *Tok = Line->First; Tok && Tok->Next; Tok = Tok->Next) { + const auto *Prev = Line->getFirstNonComment(); + if (!Prev) + break; + for (const auto *Tok = Prev->Next; Tok; Prev = Tok, Tok = Tok->Next) { if (Tok->isNot(TT_PointerOrReference)) continue; - // Don't treat space in `void foo() &&` or `void() &&` as evidence. - if (const auto *Prev = Tok->getPreviousNonComment()) { - if (Prev->is(tok::r_paren) && Prev->MatchingParen) { - if (const auto *Func = - Prev->MatchingParen->getPreviousNonComment()) { - if (Func->isOneOf(TT_FunctionDeclarationName, TT_StartOfName, - TT_OverloadedOperator) || - Func->isTypeName(LangOpts)) { - continue; - } - } - } - } - bool SpaceBefore = Tok->hasWhitespaceBefore(); - bool SpaceAfter = Tok->Next->hasWhitespaceBefore(); - if (SpaceBefore && !SpaceAfter) - ++AlignmentDiff; - if (!SpaceBefore && SpaceAfter) - --AlignmentDiff; + const auto *Next = Tok->Next; + if (!Next) + break; + if (Prev->Tok.getIdentifierInfo()) + AlignmentDiff += Tok->hasWhitespaceBefore() ? 1 : -1; + if (Next->Tok.getIdentifierInfo()) + AlignmentDiff += Next->hasWhitespaceBefore() ? -1 : 1; } } return AlignmentDiff; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index c20d099cac017..55360965d7575 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -12114,7 +12114,12 @@ TEST_F(FormatTest, UnderstandsFunctionRefQualification) { "void b() const &;\n"; verifyFormat(Prefix + "int *x;", Prefix + "int* x;", DerivePointerAlignment); - verifyGoogleFormat("MACRO(int*, std::function<void() &&>);"); + constexpr StringRef Code("MACRO(int*, std::function<void() &&>);"); + verifyFormat(Code, DerivePointerAlignment); + + auto Style = getGoogleStyle(); + Style.DerivePointerAlignment = true; + verifyFormat(Code, Style); } TEST_F(FormatTest, PointerAlignmentFallback) { >From d56e24b91760c1d734aff1617057618343275abc Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Sat, 26 Jul 2025 01:56:52 -0700 Subject: [PATCH 2/3] [clang-format] Fix a bug in `DerivePointerAlignment: true` This effectively reverts a4d4859dc70c046ad928805ddeaf8fa101793394 which didn't fix the problem that `int*,` was not counted as "Left" alignment. Fixes #150327 --- clang/lib/Format/Format.cpp | 39 +++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 38f78e80982e7..51c855c39d233 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -2639,23 +2639,42 @@ class Formatter : public TokenAnalyzer { int countVariableAlignments(const SmallVectorImpl<AnnotatedLine *> &Lines) { int AlignmentDiff = 0; + for (const AnnotatedLine *Line : Lines) { AlignmentDiff += countVariableAlignments(Line->Children); - const auto *Prev = Line->getFirstNonComment(); - if (!Prev) - break; - for (const auto *Tok = Prev->Next; Tok; Prev = Tok, Tok = Tok->Next) { + + for (const auto *Tok = Line->getFirstNonComment(); Tok; Tok = Tok->Next) { if (Tok->isNot(TT_PointerOrReference)) continue; + + const auto *Prev = Tok->Previous; + const bool PrecededByName = Prev && Prev->Tok.getIdentifierInfo(); + const bool SpaceBefore = Tok->hasWhitespaceBefore(); + + // e.g. `int **`, `int*&`, etc. + while (Tok->Next && Tok->Next->is(TT_PointerOrReference)) + Tok = Tok->Next; + const auto *Next = Tok->Next; - if (!Next) - break; - if (Prev->Tok.getIdentifierInfo()) - AlignmentDiff += Tok->hasWhitespaceBefore() ? 1 : -1; - if (Next->Tok.getIdentifierInfo()) - AlignmentDiff += Next->hasWhitespaceBefore() ? -1 : 1; + const bool FollowedByName = Next && Next->Tok.getIdentifierInfo(); + const bool SpaceAfter = Next && Next->hasWhitespaceBefore(); + + if ((!PrecededByName && !FollowedByName) || + // e.g. `int * i` or `int*i` + (PrecededByName && FollowedByName && SpaceBefore == SpaceAfter)) { + continue; + } + + if ((PrecededByName && SpaceBefore) || + (FollowedByName && !SpaceAfter)) { + ++AlignmentDiff; + } else if ((PrecededByName && !SpaceBefore) || + (FollowedByName && SpaceAfter)) { + --AlignmentDiff; + } } } + return AlignmentDiff; } >From c1eb42af2684bc5e5a8175726cd18892e5ee09f3 Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Sun, 27 Jul 2025 21:34:49 -0700 Subject: [PATCH 3/3] Add comments --- clang/lib/Format/Format.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 51c855c39d233..063780721423f 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -2667,9 +2667,11 @@ class Formatter : public TokenAnalyzer { if ((PrecededByName && SpaceBefore) || (FollowedByName && !SpaceAfter)) { + // Right alignment. ++AlignmentDiff; } else if ((PrecededByName && !SpaceBefore) || (FollowedByName && SpaceAfter)) { + // Left alignment. --AlignmentDiff; } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits