[clang] 15e14f1 - [clang-format] Preserve AmpAmpTokenType in nested parentheses
Emilia Kond via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 26 02:29:49 PDT 2023
Author: Emilia Kond
Date: 2023-06-26T12:39:16+03:00
New Revision: 15e14f129fe24db989ed91737e96505863e20c60
URL: https://github.com/llvm/llvm-project/commit/15e14f129fe24db989ed91737e96505863e20c60
DIFF: https://github.com/llvm/llvm-project/commit/15e14f129fe24db989ed91737e96505863e20c60.diff
LOG: [clang-format] Preserve AmpAmpTokenType in nested parentheses
When parsing a requires clause, the UnwrappedLineParser would delegate to
parseParens with an AmpAmpTokenType set to BinaryOperator. However,
parseParens would not carry this over into any nested parens, meaning it
could assign a different token type to an && in a requires clause.
This patch makes sure parseParens inherits its parameter when performing
a recursive call.
Fixes https://github.com/llvm/llvm-project/issues/63251
Reviewed By: HazardyKnusperkeks, owenpan, MyDeveloperDay
Differential Revision: https://reviews.llvm.org/D153641
Added:
Modified:
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/TokenAnnotatorTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 66c1205757257..e9da145391704 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -2431,14 +2431,14 @@ bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons,
/// \brief Parses a pair of parentheses (and everything between them).
/// \param AmpAmpTokenType If
diff erent than TT_Unknown sets this type for all
-/// double ampersands. This only counts for the current parens scope.
+/// double ampersands. This applies for all nested scopes as well.
void UnwrappedLineParser::parseParens(TokenType AmpAmpTokenType) {
assert(FormatTok->is(tok::l_paren) && "'(' expected.");
nextToken();
do {
switch (FormatTok->Tok.getKind()) {
case tok::l_paren:
- parseParens();
+ parseParens(AmpAmpTokenType);
if (Style.Language == FormatStyle::LK_Java && FormatTok->is(tok::l_brace))
parseChildBlock();
break;
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 6a3ecc6deb5f9..59b1421f99617 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -906,6 +906,26 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) {
annotate("auto bar() -> Template<type> requires(is_integral_v<T>) {}");
ASSERT_EQ(Tokens.size(), 19u) << Tokens;
EXPECT_TOKEN(Tokens[9], tok::kw_requires, TT_RequiresClause);
+
+ Tokens = annotate("void foo() requires((A<T>) && C) {}");
+ ASSERT_EQ(Tokens.size(), 18u) << Tokens;
+ EXPECT_TOKEN(Tokens[4], tok::kw_requires, TT_RequiresClause);
+ EXPECT_TOKEN(Tokens[12], tok::ampamp, TT_BinaryOperator);
+
+ Tokens = annotate("void foo() requires(((A<T>) && C)) {}");
+ ASSERT_EQ(Tokens.size(), 20u) << Tokens;
+ EXPECT_TOKEN(Tokens[4], tok::kw_requires, TT_RequiresClause);
+ EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);
+
+ Tokens = annotate("void foo() requires([](T&&){}(t)) {}");
+ ASSERT_EQ(Tokens.size(), 21u) << Tokens;
+ EXPECT_TOKEN(Tokens[4], tok::kw_requires, TT_RequiresClause);
+ EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);
+
+ Tokens = annotate("void foo() requires([](T&& u){}(t)) {}");
+ ASSERT_EQ(Tokens.size(), 22u) << Tokens;
+ EXPECT_TOKEN(Tokens[4], tok::kw_requires, TT_RequiresClause);
+ EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);
}
TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) {
More information about the cfe-commits
mailing list