rymiel created this revision. rymiel added a project: clang-format. rymiel added reviewers: HazardyKnusperkeks, owenpan, MyDeveloperDay. Herald added projects: All, clang. Herald added a subscriber: cfe-commits. rymiel requested review of this revision.
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 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D153641 Files: clang/lib/Format/UnwrappedLineParser.cpp clang/unittests/Format/TokenAnnotatorTest.cpp Index: clang/unittests/Format/TokenAnnotatorTest.cpp =================================================================== --- clang/unittests/Format/TokenAnnotatorTest.cpp +++ clang/unittests/Format/TokenAnnotatorTest.cpp @@ -906,6 +906,16 @@ 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); } TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) { Index: clang/lib/Format/UnwrappedLineParser.cpp =================================================================== --- clang/lib/Format/UnwrappedLineParser.cpp +++ clang/lib/Format/UnwrappedLineParser.cpp @@ -2431,14 +2431,14 @@ /// \brief Parses a pair of parentheses (and everything between them). /// \param AmpAmpTokenType If different 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;
Index: clang/unittests/Format/TokenAnnotatorTest.cpp =================================================================== --- clang/unittests/Format/TokenAnnotatorTest.cpp +++ clang/unittests/Format/TokenAnnotatorTest.cpp @@ -906,6 +906,16 @@ 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); } TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) { Index: clang/lib/Format/UnwrappedLineParser.cpp =================================================================== --- clang/lib/Format/UnwrappedLineParser.cpp +++ clang/lib/Format/UnwrappedLineParser.cpp @@ -2431,14 +2431,14 @@ /// \brief Parses a pair of parentheses (and everything between them). /// \param AmpAmpTokenType If different 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;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits