[clang] b3b68c0 - [Format] Fix 'auto x(T&&, T &&)->F' with PAS_Left.
Sam McCall via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 24 02:03:56 PST 2020
Author: Sam McCall
Date: 2020-01-24T11:03:46+01:00
New Revision: b3b68c0f802ebd9892f66bec0e7be96b3fb06e86
URL: https://github.com/llvm/llvm-project/commit/b3b68c0f802ebd9892f66bec0e7be96b3fb06e86
DIFF: https://github.com/llvm/llvm-project/commit/b3b68c0f802ebd9892f66bec0e7be96b3fb06e86.diff
LOG: [Format] Fix 'auto x(T&&, T &&)->F' with PAS_Left.
Summary:
An heuristic targetting `x && x->foo` was targed overly broadly and caused the
last T&& to be treated as a binary operator.
Reviewers: hokein
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D73334
Added:
Modified:
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 05b1db2a878d..723dc5c7ba88 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -1801,14 +1801,16 @@ class AnnotatingParser {
return TT_BinaryOperator;
// "&&(" is quite unlikely to be two successive unary "&".
- if (Tok.is(tok::ampamp) && NextToken && NextToken->is(tok::l_paren))
+ if (Tok.is(tok::ampamp) && NextToken->is(tok::l_paren))
return TT_BinaryOperator;
// This catches some cases where evaluation order is used as control flow:
// aaa && aaa->f();
- const FormatToken *NextNextToken = NextToken->getNextNonComment();
- if (NextNextToken && NextNextToken->is(tok::arrow))
- return TT_BinaryOperator;
+ if (NextToken->Tok.isAnyIdentifier()) {
+ const FormatToken *NextNextToken = NextToken->getNextNonComment();
+ if (NextNextToken && NextNextToken->is(tok::arrow))
+ return TT_BinaryOperator;
+ }
// It is very unlikely that we are going to find a pointer or reference type
// definition on the RHS of an assignment.
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 53d543728fb9..cf8bb2c52f3d 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -7407,6 +7407,9 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
verifyFormat("[](const decltype(*a)* ptr) {}", Left);
verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
+ verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left);
+ verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left);
+ verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left);
verifyIndependentOfContext("a = *(x + y);");
verifyIndependentOfContext("a = &(x + y);");
More information about the cfe-commits
mailing list