From 2e2aa8bb6dea365e972528ad330f575b6b6e254b Mon Sep 17 00:00:00 2001 From: Owen Pan Date: Wed, 11 Jan 2023 20:07:21 -0800 Subject: [PATCH] [clang-format] Fix a bug in DerivePointerAlignment fallback Fixes #59953. Differential Revision: https://reviews.llvm.org/D141563 --- clang/lib/Format/Format.cpp | 8 +++++--- clang/unittests/Format/FormatTest.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 68f24fa..6b37407 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -2282,9 +2282,11 @@ private: } } if (Style.DerivePointerAlignment) { - Style.PointerAlignment = countVariableAlignments(AnnotatedLines) <= 0 - ? FormatStyle::PAS_Left - : FormatStyle::PAS_Right; + const auto NetRightCount = countVariableAlignments(AnnotatedLines); + if (NetRightCount > 0) + Style.PointerAlignment = FormatStyle::PAS_Right; + else if (NetRightCount < 0) + Style.PointerAlignment = FormatStyle::PAS_Left; Style.ReferenceAlignment = FormatStyle::RAS_Pointer; } if (Style.Standard == FormatStyle::LS_Auto) { diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 4c7c949..6fc538c 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -10781,6 +10781,33 @@ TEST_F(FormatTest, UnderstandsFunctionRefQualification) { format(Prefix + "int* x;", DerivePointerAlignment)); } +TEST_F(FormatTest, PointerAlignmentFallback) { + FormatStyle Style = getLLVMStyle(); + Style.DerivePointerAlignment = true; + + const StringRef Code("int* p;\n" + "int *q;\n" + "int * r;"); + + EXPECT_EQ(Style.PointerAlignment, FormatStyle::PAS_Right); + verifyFormat("int *p;\n" + "int *q;\n" + "int *r;", + Code, Style); + + Style.PointerAlignment = FormatStyle::PAS_Left; + verifyFormat("int* p;\n" + "int* q;\n" + "int* r;", + Code, Style); + + Style.PointerAlignment = FormatStyle::PAS_Middle; + verifyFormat("int * p;\n" + "int * q;\n" + "int * r;", + Code, Style); +} + TEST_F(FormatTest, UnderstandsNewAndDelete) { verifyFormat("void f() {\n" " A *a = new A;\n" -- 2.7.4