diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index b904e0e56d9eb..0a7f8808f29af 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -3446,11 +3446,6 @@ bool clang::format::UnwrappedLineParser::parseRequires() { return false; } break; - case tok::r_paren: - case tok::pipepipe: - FormatTok = Tokens->setPosition(StoredPosition); - parseRequiresClause(RequiresToken); - return true; case tok::eof: // Break out of the loop. Lookahead = 50; @@ -3458,6 +3453,7 @@ bool clang::format::UnwrappedLineParser::parseRequires() { case tok::coloncolon: LastWasColonColon = true; break; + case tok::kw_decltype: case tok::identifier: if (FoundType && !LastWasColonColon && OpenAngles == 0) { FormatTok = Tokens->setPosition(StoredPosition); diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index f3e443e8829bd..6e5832858c1ec 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -1076,6 +1076,28 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) { "concept C = (!Foo) && Bar;"); ASSERT_EQ(Tokens.size(), 19u) << Tokens; EXPECT_TOKEN(Tokens[15], tok::ampamp, TT_BinaryOperator); + + Tokens = annotate("void f() & requires(C) {}"); + ASSERT_EQ(Tokens.size(), 18u) << Tokens; + EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause); + + Tokens = annotate("auto f() -> int& requires(C) {}"); + ASSERT_EQ(Tokens.size(), 20u) << Tokens; + EXPECT_TOKEN(Tokens[6], tok::amp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause); + + Tokens = annotate("bool x = t && requires(decltype(t) x) { x.foo(); };"); + ASSERT_EQ(Tokens.size(), 23u) << Tokens; + EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresExpression); + + Tokens = annotate("bool x = t && requires(Foo x) { x.foo(); };"); + ASSERT_EQ(Tokens.size(), 26u) << Tokens; + EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresExpression); + + 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); } TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) {