diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 40f77266fabdca..98078fb50dcfaa 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -3528,6 +3528,17 @@ bool UnwrappedLineParser::parseRequires() { return false; } break; + case tok::equalequal: + case tok::greaterequal: + case tok::lessequal: + case tok::r_paren: + case tok::pipepipe: + if (OpenAngles == 0) { + FormatTok = Tokens->setPosition(StoredPosition); + parseRequiresClause(RequiresToken); + return true; + } + break; case tok::eof: // Break out of the loop. Lookahead = 50; diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 1884d41a5f23f5..6f1b1df0bda655 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -1296,6 +1296,21 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) { Tokens = annotate("bool x = t && requires(Foo x) { x.foo(); };"); ASSERT_EQ(Tokens.size(), 25u) << Tokens; EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresExpression); + + // Second function definition is required due to lookahead + Tokens = annotate("void f() & requires(n == 1) {}\nvoid g();"); + ASSERT_EQ(Tokens.size(), 19u) << Tokens; + EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause); + + Tokens = annotate("void f() & requires(n || h) {}\nvoid g();"); + ASSERT_EQ(Tokens.size(), 19u) << Tokens; + EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause); + + Tokens = annotate("bool x = t && requires(F x) { x.foo(); };"); + ASSERT_EQ(Tokens.size(), 25u) << Tokens; + EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresExpression); } TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) {