[PATCH] D121846: [clang-format] Correctly recognize binary operators in template arguments with parenthesized literals.
Marek Kurdej via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 17 01:37:42 PDT 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
curdeius marked an inline comment as done.
Closed by commit rGdc142ea184a5: [clang-format] Correctly recognize binary operators in template arguments with… (authored by curdeius).
Changed prior to commit:
https://reviews.llvm.org/D121846?vs=415962&id=416092#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D121846/new/
https://reviews.llvm.org/D121846
Files:
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTest.cpp
Index: clang/unittests/Format/FormatTest.cpp
===================================================================
--- clang/unittests/Format/FormatTest.cpp
+++ clang/unittests/Format/FormatTest.cpp
@@ -10333,6 +10333,11 @@
verifyFormat("vector<a * b> v;");
verifyFormat("foo<b && false>();");
verifyFormat("foo<b & 1>();");
+ verifyFormat("foo<b & (1)>();");
+ verifyFormat("foo<b & (~0)>();");
+ verifyFormat("foo<b & (true)>();");
+ verifyFormat("foo<b & ((1))>();");
+ verifyFormat("foo<b & (/*comment*/ 1)>();");
verifyFormat("decltype(*::std::declval<const T &>()) void F();");
verifyFormat("typeof(*::std::declval<const T &>()) void F();");
verifyFormat("_Atomic(*::std::declval<const T &>()) void F();");
Index: clang/lib/Format/TokenAnnotator.cpp
===================================================================
--- clang/lib/Format/TokenAnnotator.cpp
+++ clang/lib/Format/TokenAnnotator.cpp
@@ -2177,14 +2177,21 @@
if (PrevToken->Tok.isLiteral() ||
PrevToken->isOneOf(tok::r_paren, tok::r_square, tok::kw_true,
- tok::kw_false, tok::r_brace) ||
- NextToken->Tok.isLiteral() ||
- NextToken->isOneOf(tok::kw_true, tok::kw_false) ||
- NextToken->isUnaryOperator() ||
- // If we know we're in a template argument, there are no named
- // declarations. Thus, having an identifier on the right-hand side
- // indicates a binary operator.
- (InTemplateArgument && NextToken->Tok.isAnyIdentifier()))
+ tok::kw_false, tok::r_brace))
+ return TT_BinaryOperator;
+
+ const FormatToken *NextNonParen = NextToken;
+ while (NextNonParen && NextNonParen->is(tok::l_paren))
+ NextNonParen = NextNonParen->getNextNonComment();
+ if (NextNonParen && (NextNonParen->Tok.isLiteral() ||
+ NextNonParen->isOneOf(tok::kw_true, tok::kw_false) ||
+ NextNonParen->isUnaryOperator()))
+ return TT_BinaryOperator;
+
+ // If we know we're in a template argument, there are no named declarations.
+ // Thus, having an identifier on the right-hand side indicates a binary
+ // operator.
+ if (InTemplateArgument && NextToken->Tok.isAnyIdentifier())
return TT_BinaryOperator;
// "&&(" is quite unlikely to be two successive unary "&".
@@ -4508,12 +4515,11 @@
// We only break before r_paren if we're in a block indented context.
if (Right.is(tok::r_paren)) {
- if (Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) {
+ if (Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent)
return Right.MatchingParen &&
!(Right.MatchingParen->Previous &&
(Right.MatchingParen->Previous->is(tok::kw_for) ||
Right.MatchingParen->Previous->isIf()));
- }
return false;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D121846.416092.patch
Type: text/x-patch
Size: 2870 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220317/543078de/attachment.bin>
More information about the cfe-commits
mailing list