diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 77a59d8585091b..c1bfa4d573a72c 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -3168,6 +3168,11 @@ bool clang::format::UnwrappedLineParser::parseRequires() { break; } default: + if (PreviousNonComment->isTypeOrIdentifier()) { + // This is a requires clause. + parseRequiresClause(RequiresToken); + return true; + } // It's an expression. parseRequiresExpression(RequiresToken); return false; diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index aa91f389a5d2e2..2dbc5da07d4db0 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -402,6 +402,33 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) { EXPECT_TOKEN(Tokens[25], tok::less, TT_TemplateOpener); EXPECT_TOKEN(Tokens[27], tok::greater, TT_TemplateCloser); EXPECT_TOKEN(Tokens[28], tok::greater, TT_TemplateCloser); + + Tokens = annotate("auto bar() -> int requires(is_integral_v) {}"); + ASSERT_EQ(Tokens.size(), 16u) << Tokens; + EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause); + + Tokens = annotate("auto bar() -> void requires(is_integral_v) {}"); + ASSERT_EQ(Tokens.size(), 16u) << Tokens; + EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause); + + Tokens = annotate("auto bar() -> MyType requires(is_integral_v) {}"); + ASSERT_EQ(Tokens.size(), 16u) << Tokens; + EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause); + + Tokens = + annotate("auto bar() -> SOME_MACRO_TYPE requires(is_integral_v) {}"); + ASSERT_EQ(Tokens.size(), 16u) << Tokens; + EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause); + + Tokens = + annotate("auto bar() -> qualified::type requires(is_integral_v) {}"); + ASSERT_EQ(Tokens.size(), 18u) << Tokens; + EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresClause); + + Tokens = + annotate("auto bar() -> Template requires(is_integral_v) {}"); + ASSERT_EQ(Tokens.size(), 19u) << Tokens; + EXPECT_TOKEN(Tokens[9], tok::kw_requires, TT_RequiresClause); } TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) {