Skip to content

Commit 126b37a

Browse files
committed
[clang-format] Correctly recognize arrays in template parameter list.
Fixes llvm/llvm-project#54245. Reviewed By: MyDeveloperDay, HazardyKnusperkeks, owenpan Differential Revision: https://reviews.llvm.org/D121584
1 parent 9f864a5 commit 126b37a

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

clang/lib/Format/UnwrappedLineParser.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1935,6 +1935,11 @@ bool UnwrappedLineParser::tryToParseLambda() {
19351935
if (!tryToParseLambdaIntroducer())
19361936
return false;
19371937

1938+
// `[something] >` is not a lambda, but an array type in a template parameter
1939+
// list.
1940+
if (FormatTok->is(tok::greater))
1941+
return false;
1942+
19381943
bool SeenArrow = false;
19391944
bool InTemplateParameterList = false;
19401945

@@ -3524,7 +3529,7 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) {
35243529
// Don't try parsing a lambda if we had a closing parenthesis before,
35253530
// it was probably a pointer to an array: int (*)[].
35263531
if (!tryToParseLambda())
3527-
break;
3532+
continue;
35283533
} else {
35293534
parseSquare();
35303535
continue;

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,20 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
9898
auto Tokens = annotate("struct S {};");
9999
EXPECT_EQ(Tokens.size(), 6u) << Tokens;
100100
EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_StructLBrace);
101+
102+
Tokens = annotate("template <typename T> struct S<const T[N]> {};");
103+
EXPECT_EQ(Tokens.size(), 18u) << Tokens;
104+
EXPECT_TOKEN(Tokens[7], tok::less, TT_TemplateOpener);
105+
EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare);
106+
EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);
107+
EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_StructLBrace);
108+
109+
Tokens = annotate("template <typename T> struct S<T const[N]> {};");
110+
EXPECT_EQ(Tokens.size(), 18u) << Tokens;
111+
EXPECT_TOKEN(Tokens[7], tok::less, TT_TemplateOpener);
112+
EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare);
113+
EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);
114+
EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_StructLBrace);
101115
}
102116

103117
TEST_F(TokenAnnotatorTest, UnderstandsUnions) {

0 commit comments

Comments
 (0)