Skip to content

Commit a83e09a

Browse files
authored
[clang-format] Handle && in requires clause in requires requires (llvm#169207)
Fixes llvm#152266
1 parent d8b6524 commit a83e09a

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3129,8 +3129,11 @@ class AnnotatingParser {
31293129

31303130
// It is very unlikely that we are going to find a pointer or reference type
31313131
// definition on the RHS of an assignment.
3132-
if (IsExpression && !Contexts.back().CaretFound)
3132+
if (IsExpression && !Contexts.back().CaretFound &&
3133+
Line.getFirstNonComment()->isNot(
3134+
TT_RequiresClauseInARequiresExpression)) {
31333135
return TT_BinaryOperator;
3136+
}
31343137

31353138
// Opeartors at class scope are likely pointer or reference members.
31363139
if (!Scopes.empty() && Scopes.back() == ST_Class)

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,6 +1391,15 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) {
13911391
ASSERT_EQ(Tokens.size(), 38u) << Tokens;
13921392
EXPECT_TOKEN(Tokens[19], tok::l_brace, TT_RequiresExpressionLBrace);
13931393

1394+
Tokens =
1395+
annotate("template <typename... Ts>\n"
1396+
" requires requires {\n"
1397+
" requires std::same_as<int, SomeTemplate<void(Ts &&...)>>;\n"
1398+
" }\n"
1399+
"void Foo();");
1400+
ASSERT_EQ(Tokens.size(), 34u) << Tokens;
1401+
EXPECT_TOKEN(Tokens[21], tok::ampamp, TT_PointerOrReference);
1402+
13941403
Tokens =
13951404
annotate("template <class A, class B> concept C ="
13961405
"std::same_as<std::iter_value_t<A>, std::iter_value_t<B>>;");

0 commit comments

Comments
 (0)