[clang-move] Support moving template class forward declarations.
authorHaojian Wu <hokein@google.com>
Fri, 21 Oct 2016 19:26:43 +0000 (19:26 +0000)
committerHaojian Wu <hokein@google.com>
Fri, 21 Oct 2016 19:26:43 +0000 (19:26 +0000)
llvm-svn: 284859

clang-tools-extra/clang-move/ClangMove.cpp
clang-tools-extra/unittests/clang-move/ClangMoveTests.cpp

index 62356d2..dea41b2 100644 (file)
@@ -406,8 +406,13 @@ void ClangMoveTool::run(const ast_matchers::MatchFinder::MatchResult &Result) {
   } else if (const auto *FWD =
                  Result.Nodes.getNodeAs<clang::CXXRecordDecl>("fwd_decl")) {
     // Skip all forwad declarations which appear after moved class declaration.
-    if (RemovedDecls.empty())
-      MovedDecls.emplace_back(FWD, &Result.Context->getSourceManager());
+    if (RemovedDecls.empty()) {
+      if (const auto *DCT = FWD->getDescribedClassTemplate()) {
+        MovedDecls.emplace_back(DCT, &Result.Context->getSourceManager());
+      } else {
+        MovedDecls.emplace_back(FWD, &Result.Context->getSourceManager());
+      }
+    }
   } else if (const auto *ANS = Result.Nodes.getNodeAs<clang::NamespaceDecl>(
                  "anonymous_ns")) {
     MovedDecls.emplace_back(ANS, &Result.Context->getSourceManager());
index b4b4ae9..572a0f0 100644 (file)
@@ -30,6 +30,7 @@ const char TestCCName[] = "foo.cc";
 
 const char TestHeader[] = "namespace a {\n"
                           "class C1; // test\n"
+                          "template <typename T> class C2;\n"
                           "namespace b {\n"
                           "// This is a Foo class\n"
                           "// which is used in\n"
@@ -87,6 +88,7 @@ const char TestCC[] = "#include \"foo.h\"\n"
 
 const char ExpectedTestHeader[] = "namespace a {\n"
                                   "class C1; // test\n"
+                                  "template <typename T> class C2;\n"
                                   "namespace b {\n"
                                   "\n"
                                   "class Foo2 {\n"
@@ -127,6 +129,7 @@ const char ExpectedNewHeader[] = "#ifndef NEW_FOO_H\n"
                                  "#define NEW_FOO_H\n"
                                  "namespace a {\n"
                                  "class C1; // test\n"
+                                 "template <typename T> class C2;\n"
                                  "namespace b {\n"
                                  "// This is a Foo class\n"
                                  "// which is used in\n"