summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaojian Wu <hokein@google.com>2016-10-21 19:26:43 +0000
committerHaojian Wu <hokein@google.com>2016-10-21 19:26:43 +0000
commit29c38f75a2c86a99655b68c4aa8879b0f2ea2d9d (patch)
treefce93d79498e10e8a51d7846aba6d1e65ebfb918
parent0109bf116fac77764699955ea67e5451280e86f6 (diff)
downloadbcm5719-llvm-29c38f75a2c86a99655b68c4aa8879b0f2ea2d9d.tar.gz
bcm5719-llvm-29c38f75a2c86a99655b68c4aa8879b0f2ea2d9d.zip
[clang-move] Support moving template class forward declarations.
llvm-svn: 284859
-rw-r--r--clang-tools-extra/clang-move/ClangMove.cpp9
-rw-r--r--clang-tools-extra/unittests/clang-move/ClangMoveTests.cpp3
2 files changed, 10 insertions, 2 deletions
diff --git a/clang-tools-extra/clang-move/ClangMove.cpp b/clang-tools-extra/clang-move/ClangMove.cpp
index 62356d278e7..dea41b2cfff 100644
--- a/clang-tools-extra/clang-move/ClangMove.cpp
+++ b/clang-tools-extra/clang-move/ClangMove.cpp
@@ -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());
diff --git a/clang-tools-extra/unittests/clang-move/ClangMoveTests.cpp b/clang-tools-extra/unittests/clang-move/ClangMoveTests.cpp
index b4b4ae9ffe3..572a0f096dc 100644
--- a/clang-tools-extra/unittests/clang-move/ClangMoveTests.cpp
+++ b/clang-tools-extra/unittests/clang-move/ClangMoveTests.cpp
@@ -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"
OpenPOWER on IntegriCloud