Skip to content

Commit 6621505

Browse files
authored
[clang-format] Don't count template template parameter as declaration (#96396)
Reapply 4a7bf42 which was reverted in 34d44eb Not sure why there are tests elsewhere in clang that rely on the output of clang-format, but they were wrong
1 parent 2c9c22c commit 6621505

File tree

3 files changed

+38
-13
lines changed

3 files changed

+38
-13
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class AnnotatingParser {
127127
SmallVector<ScopeType> &Scopes)
128128
: Style(Style), Line(Line), CurrentToken(Line.First), AutoFound(false),
129129
IsCpp(Style.isCpp()), LangOpts(getFormattingLangOpts(Style)),
130-
Keywords(Keywords), Scopes(Scopes) {
130+
Keywords(Keywords), Scopes(Scopes), TemplateDeclarationDepth(0) {
131131
assert(IsCpp == LangOpts.CXXOperatorNames);
132132
Contexts.push_back(Context(tok::unknown, 1, /*IsExpression=*/false));
133133
resetTokenMetadata();
@@ -1266,16 +1266,22 @@ class AnnotatingParser {
12661266
}
12671267

12681268
bool parseTemplateDeclaration() {
1269-
if (CurrentToken && CurrentToken->is(tok::less)) {
1270-
CurrentToken->setType(TT_TemplateOpener);
1271-
next();
1272-
if (!parseAngle())
1273-
return false;
1274-
if (CurrentToken)
1275-
CurrentToken->Previous->ClosesTemplateDeclaration = true;
1276-
return true;
1277-
}
1278-
return false;
1269+
if (!CurrentToken || CurrentToken->isNot(tok::less))
1270+
return false;
1271+
1272+
CurrentToken->setType(TT_TemplateOpener);
1273+
next();
1274+
1275+
TemplateDeclarationDepth++;
1276+
const bool WellFormed = parseAngle();
1277+
TemplateDeclarationDepth--;
1278+
if (!WellFormed)
1279+
return false;
1280+
1281+
if (CurrentToken && TemplateDeclarationDepth == 0)
1282+
CurrentToken->Previous->ClosesTemplateDeclaration = true;
1283+
1284+
return true;
12791285
}
12801286

12811287
bool consumeToken() {
@@ -3091,6 +3097,8 @@ class AnnotatingParser {
30913097
// same decision irrespective of the decisions for tokens leading up to it.
30923098
// Store this information to prevent this from causing exponential runtime.
30933099
llvm::SmallPtrSet<FormatToken *, 16> NonTemplateLess;
3100+
3101+
int TemplateDeclarationDepth;
30943102
};
30953103

30963104
static const int PrecedenceUnaryOperator = prec::PointerToMember + 1;

clang/test/Index/overriding-ftemplate-comments.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@ void comment_to_html_conversion_21();
7777
template <class C1, template <class C2, template <class C3, class C4> class BBB > class AAA>
7878
void comment_to_html_conversion_22();
7979

80-
// CHECK: FullCommentAsXML=[<Function templateKind="template" file="{{[^"]+}}overriding-ftemplate-comments.cpp" line="[[@LINE-2]]" column="6"><Name>comment_to_html_conversion_22</Name><USR>c:@FT@&gt;2#T#t&gt;2#T#t&gt;2#T#Tcomment_to_html_conversion_22#v#</USR><Declaration>template &lt;class C1, template &lt;class C2, template &lt;class C3, class C4&gt; class BBB&gt;\n class AAA&gt;\nvoid comment_to_html_conversion_22()</Declaration><TemplateParameters><Parameter><Name>C1</Name><Index>0</Index><Discussion><Para> Ccc 1 </Para></Discussion></Parameter><Parameter><Name>AAA</Name><Index>1</Index><Discussion><Para> Zzz </Para></Discussion></Parameter><Parameter><Name>C2</Name><Discussion><Para> Ccc 2 </Para></Discussion></Parameter><Parameter><Name>C3</Name><Discussion><Para> Ccc 3 </Para></Discussion></Parameter><Parameter><Name>C4</Name><Discussion><Para> Ccc 4 </Para></Discussion></Parameter><Parameter><Name>BBB</Name><Discussion><Para> Bbb</Para></Discussion></Parameter></TemplateParameters></Function>]
80+
// CHECK: FullCommentAsXML=[<Function templateKind="template" file="{{[^"]+}}overriding-ftemplate-comments.cpp" line="[[@LINE-2]]" column="6"><Name>comment_to_html_conversion_22</Name><USR>c:@FT@&gt;2#T#t&gt;2#T#t&gt;2#T#Tcomment_to_html_conversion_22#v#</USR><Declaration>template &lt;\n class C1,\n template &lt;class C2, template &lt;class C3, class C4&gt; class BBB&gt; class AAA&gt;\nvoid comment_to_html_conversion_22()</Declaration><TemplateParameters><Parameter><Name>C1</Name><Index>0</Index><Discussion><Para> Ccc 1 </Para></Discussion></Parameter><Parameter><Name>AAA</Name><Index>1</Index><Discussion><Para> Zzz </Para></Discussion></Parameter><Parameter><Name>C2</Name><Discussion><Para> Ccc 2 </Para></Discussion></Parameter><Parameter><Name>C3</Name><Discussion><Para> Ccc 3 </Para></Discussion></Parameter><Parameter><Name>C4</Name><Discussion><Para> Ccc 4 </Para></Discussion></Parameter><Parameter><Name>BBB</Name><Discussion><Para> Bbb</Para></Discussion></Parameter></TemplateParameters></Function>]
8181

8282
template<class CCC1, template<class CCC2, template<class CCC3, class CCC4> class QQQ> class PPP>
8383
void comment_to_html_conversion_22();
8484

85-
// CHECK: FullCommentAsXML=[<Function templateKind="template" file="{{[^"]+}}overriding-ftemplate-comments.cpp" line="[[@LINE-2]]" column="6"><Name>comment_to_html_conversion_22</Name><USR>c:@FT@&gt;2#T#t&gt;2#T#t&gt;2#T#Tcomment_to_html_conversion_22#v#</USR><Declaration>template &lt;class CCC1,\n template &lt;class CCC2, template &lt;class CCC3, class CCC4&gt; class QQQ&gt;\n class PPP&gt;\nvoid comment_to_html_conversion_22()</Declaration><TemplateParameters><Parameter><Name>CCC1</Name><Index>0</Index><Discussion><Para> Ccc 1 </Para></Discussion></Parameter><Parameter><Name>PPP</Name><Index>1</Index><Discussion><Para> Zzz </Para></Discussion></Parameter><Parameter><Name>CCC2</Name><Discussion><Para> Ccc 2 </Para></Discussion></Parameter><Parameter><Name>CCC3</Name><Discussion><Para> Ccc 3 </Para></Discussion></Parameter><Parameter><Name>CCC4</Name><Discussion><Para> Ccc 4 </Para></Discussion></Parameter><Parameter><Name>QQQ</Name><Discussion><Para> Bbb</Para></Discussion></Parameter></TemplateParameters></Function>]
85+
// CHECK: FullCommentAsXML=[<Function templateKind="template" file="{{[^"]+}}overriding-ftemplate-comments.cpp" line="[[@LINE-2]]" column="6"><Name>comment_to_html_conversion_22</Name><USR>c:@FT@&gt;2#T#t&gt;2#T#t&gt;2#T#Tcomment_to_html_conversion_22#v#</USR><Declaration>template &lt;class CCC1,\n template &lt;class CCC2,\n template &lt;class CCC3, class CCC4&gt; class QQQ&gt; class PPP&gt;\nvoid comment_to_html_conversion_22()</Declaration><TemplateParameters><Parameter><Name>CCC1</Name><Index>0</Index><Discussion><Para> Ccc 1 </Para></Discussion></Parameter><Parameter><Name>PPP</Name><Index>1</Index><Discussion><Para> Zzz </Para></Discussion></Parameter><Parameter><Name>CCC2</Name><Discussion><Para> Ccc 2 </Para></Discussion></Parameter><Parameter><Name>CCC3</Name><Discussion><Para> Ccc 3 </Para></Discussion></Parameter><Parameter><Name>CCC4</Name><Discussion><Para> Ccc 4 </Para></Discussion></Parameter><Parameter><Name>QQQ</Name><Discussion><Para> Bbb</Para></Discussion></Parameter></TemplateParameters></Function>]
8686

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,23 @@ TEST_F(TokenAnnotatorTest, UnderstandsNonTemplateAngleBrackets) {
584584
EXPECT_TOKEN(Tokens[20], tok::greater, TT_BinaryOperator);
585585
}
586586

587+
TEST_F(TokenAnnotatorTest, UnderstandsTemplateTemplateParameters) {
588+
auto Tokens = annotate("template <template <typename...> typename X,\n"
589+
" template <typename...> class Y,\n"
590+
" typename... T>\n"
591+
"class A {};");
592+
ASSERT_EQ(Tokens.size(), 28u) << Tokens;
593+
EXPECT_TOKEN(Tokens[1], tok::less, TT_TemplateOpener);
594+
EXPECT_TOKEN(Tokens[3], tok::less, TT_TemplateOpener);
595+
EXPECT_TOKEN(Tokens[6], tok::greater, TT_TemplateCloser);
596+
EXPECT_FALSE(Tokens[6]->ClosesTemplateDeclaration);
597+
EXPECT_TOKEN(Tokens[11], tok::less, TT_TemplateOpener);
598+
EXPECT_TOKEN(Tokens[14], tok::greater, TT_TemplateCloser);
599+
EXPECT_FALSE(Tokens[14]->ClosesTemplateDeclaration);
600+
EXPECT_TOKEN(Tokens[21], tok::greater, TT_TemplateCloser);
601+
EXPECT_TRUE(Tokens[21]->ClosesTemplateDeclaration);
602+
}
603+
587604
TEST_F(TokenAnnotatorTest, UnderstandsWhitespaceSensitiveMacros) {
588605
FormatStyle Style = getLLVMStyle();
589606
Style.WhitespaceSensitiveMacros.push_back("FOO");

0 commit comments

Comments
 (0)