diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -2282,9 +2282,11 @@ } } 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 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -10781,6 +10781,33 @@ 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"