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 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; 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 requires(is_integral_v) {}"); ASSERT_EQ(Tokens.size(), 19u) << Tokens; EXPECT_TOKEN(Tokens[9], tok::kw_requires, TT_RequiresClause); + + Tokens = annotate("void foo() requires((A) && 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) && 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) {