diff --git a/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp b/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp --- a/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp +++ b/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp @@ -3051,84 +3051,105 @@ )txt")); } -TEST_P(SyntaxTreeTest, ExplicitTemplateInstantations) { +TEST_P(SyntaxTreeTest, ExplicitTemplateInstantation_Definition) { if (!GetParam().isCXX()) { return; } - EXPECT_TRUE(treeDumpEqual( + EXPECT_TRUE(treeDumpEqualOnAnnotations( R"cpp( template struct X {}; -template struct X {}; -template <> struct X {}; +[[template struct X;]] +)cpp", + {R"txt( +ExplicitTemplateInstantiation +|-template +`-SimpleDeclaration + |-struct + |-X + |-< + |-double + |-> + `-; +)txt"})); +} -template struct X; -extern template struct X; +TEST_P(SyntaxTreeTest, ExplicitTemplateInstantation_Declaration) { + if (!GetParam().isCXX()) { + return; + } + EXPECT_TRUE(treeDumpEqualOnAnnotations( + R"cpp( +template struct X {}; +[[extern template struct X;]] )cpp", - R"txt( -*: TranslationUnit -|-TemplateDeclaration -| |-template -| |-< -| |-UnknownDeclaration -| | |-class -| | `-T -| |-> -| `-SimpleDeclaration -| |-struct -| |-X -| |-{ -| |-} -| `-; -|-TemplateDeclaration -| |-template -| |-< -| |-UnknownDeclaration -| | |-class -| | `-T -| |-> -| `-SimpleDeclaration -| |-struct -| |-X -| |-< -| |-T -| |-* -| |-> -| |-{ -| |-} -| `-; -|-TemplateDeclaration -| |-template -| |-< -| |-> -| `-SimpleDeclaration -| |-struct -| |-X -| |-< -| |-int -| |-> -| |-{ -| |-} -| `-; -|-ExplicitTemplateInstantiation -| |-template -| `-SimpleDeclaration -| |-struct -| |-X -| |-< -| |-double -| |-> -| `-; -`-ExplicitTemplateInstantiation - |-extern - |-template - `-SimpleDeclaration - |-struct - |-X - |-< - |-float - |-> - `-; -)txt")); + {R"txt( +ExplicitTemplateInstantiation +|-extern +|-template +`-SimpleDeclaration + |-struct + |-X + |-< + |-float + |-> + `-; +)txt"})); +} + +TEST_P(SyntaxTreeTest, TemplateSpecialization_Partial) { + if (!GetParam().isCXX()) { + return; + } + EXPECT_TRUE(treeDumpEqualOnAnnotations( + R"cpp( +template struct X {}; +[[template struct X {};]] +)cpp", + {R"txt( +TemplateDeclaration +|-template +|-< +|-UnknownDeclaration +| |-class +| `-T +|-> +`-SimpleDeclaration + |-struct + |-X + |-< + |-T + |-* + |-> + |-{ + |-} + `-; +)txt"})); +} + +TEST_P(SyntaxTreeTest, TemplateSpecialization_Full) { + if (!GetParam().isCXX()) { + return; + } + EXPECT_TRUE(treeDumpEqualOnAnnotations( + R"cpp( +template struct X {}; +[[template <> struct X {};]] +)cpp", + {R"txt( +TemplateDeclaration +|-template +|-< +|-> +`-SimpleDeclaration + |-struct + |-X + |-< + |-int + |-> + |-{ + |-} + `-; +)txt"})); } TEST_P(SyntaxTreeTest, UsingType) {