[PATCH] D118921: [Format] Don't derive pointers right based on space before method ref-qualifiers
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 4 03:16:53 PST 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
sammccall marked an inline comment as done.
Closed by commit rGacc3ce945c32: [Format] Don't derive pointers right based on space before method ref-qualifiers (authored by sammccall).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D118921/new/
https://reviews.llvm.org/D118921
Files:
clang/lib/Format/Format.cpp
clang/unittests/Format/FormatTest.cpp
Index: clang/unittests/Format/FormatTest.cpp
===================================================================
--- clang/unittests/Format/FormatTest.cpp
+++ clang/unittests/Format/FormatTest.cpp
@@ -9710,6 +9710,25 @@
AlignLeftBreakTemplate);
verifyFormat("void (*foopt)(int) = &func;");
+
+ FormatStyle DerivePointerAlignment = getLLVMStyle();
+ DerivePointerAlignment.DerivePointerAlignment = true;
+ // There's always a space between the function and its trailing qualifiers.
+ // This isn't evidence for PAS_Right (or for PAS_Left).
+ std::string Prefix = "void a() &;\n"
+ "void b() &;\n";
+ verifyFormat(Prefix + "int* x;", DerivePointerAlignment);
+ verifyFormat(Prefix + "int *x;", DerivePointerAlignment);
+ // Same if the function is an overloaded operator instead.
+ Prefix = "void operator()() &;\n"
+ "void operator()() &;\n";
+ verifyFormat(Prefix + "int* x;", DerivePointerAlignment);
+ verifyFormat(Prefix + "int *x;", DerivePointerAlignment);
+ // However a space between cv-qualifiers and ref-qualifiers *is* evidence.
+ Prefix = "void a() const &;\n"
+ "void b() const &;\n";
+ EXPECT_EQ(Prefix + "int *x;",
+ format(Prefix + "int* x;", DerivePointerAlignment));
}
TEST_F(FormatTest, UnderstandsNewAndDelete) {
Index: clang/lib/Format/Format.cpp
===================================================================
--- clang/lib/Format/Format.cpp
+++ clang/lib/Format/Format.cpp
@@ -18,6 +18,7 @@
#include "ContinuationIndenter.h"
#include "DefinitionBlockSeparator.h"
#include "FormatInternal.h"
+#include "FormatToken.h"
#include "FormatTokenLexer.h"
#include "NamespaceEndCommentsFixer.h"
#include "QualifierAlignmentFixer.h"
@@ -1940,6 +1941,14 @@
for (FormatToken *Tok = Line->First; Tok && Tok->Next; Tok = Tok->Next) {
if (!Tok->is(TT_PointerOrReference))
continue;
+ // Don't treat space in `void foo() &&` 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))
+ continue;
+ }
bool SpaceBefore = Tok->hasWhitespaceBefore();
bool SpaceAfter = Tok->Next->hasWhitespaceBefore();
if (SpaceBefore && !SpaceAfter)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D118921.405910.patch
Type: text/x-patch
Size: 2518 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220204/1e8672dd/attachment-0001.bin>
More information about the cfe-commits
mailing list