diff options
author | Haojian Wu <hokein@google.com> | 2017-10-25 08:25:25 +0000 |
---|---|---|
committer | Haojian Wu <hokein@google.com> | 2017-10-25 08:25:25 +0000 |
commit | 6ec2b8ac775918c4cdb5e3920a8ac212dcc1097c (patch) | |
tree | 263d552cf3833f0645928f11bf3cc72df020e0a7 /clang | |
parent | 238c14b6c7970b1d6f48ef2c5ad35c772f1dee3d (diff) | |
download | bcm5719-llvm-6ec2b8ac775918c4cdb5e3920a8ac212dcc1097c.tar.gz bcm5719-llvm-6ec2b8ac775918c4cdb5e3920a8ac212dcc1097c.zip |
[clang-rename] Fix and enable the failing TemplatedClassFunction test.
Reviewers: ioeric
Reviewed By: ioeric
Subscribers: klimek, cfe-commits
Differential Revision: https://reviews.llvm.org/D39241
llvm-svn: 316561
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp | 20 | ||||
-rw-r--r-- | clang/test/clang-rename/TemplatedClassFunction.cpp | 17 |
2 files changed, 31 insertions, 6 deletions
diff --git a/clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp b/clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp index 0c746bbbcb7..40b70d8a059 100644 --- a/clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp +++ b/clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp @@ -73,6 +73,7 @@ public: if (checkIfOverriddenFunctionAscends(OverriddenMethod)) USRSet.insert(getUSRForDecl(OverriddenMethod)); } + addUSRsOfInstantiatedMethods(MethodDecl); } else if (const auto *RecordDecl = dyn_cast<CXXRecordDecl>(FoundDecl)) { handleCXXRecordDecl(RecordDecl); } else if (const auto *TemplateDecl = @@ -84,9 +85,13 @@ public: return std::vector<std::string>(USRSet.begin(), USRSet.end()); } + bool shouldVisitTemplateInstantiations() const { return true; } + bool VisitCXXMethodDecl(const CXXMethodDecl *MethodDecl) { if (MethodDecl->isVirtual()) OverriddenMethods.push_back(MethodDecl); + if (MethodDecl->getInstantiatedFromMemberFunction()) + InstantiatedMethods.push_back(MethodDecl); return true; } @@ -137,6 +142,20 @@ private: addUSRsOfOverridenFunctions(OverriddenMethod); } + void addUSRsOfInstantiatedMethods(const CXXMethodDecl *MethodDecl) { + // For renaming a class template method, all references of the instantiated + // member methods should be renamed too, so add USRs of the instantiated + // methods to the USR set. + USRSet.insert(getUSRForDecl(MethodDecl)); + if (const auto *FT = MethodDecl->getInstantiatedFromMemberFunction()) + USRSet.insert(getUSRForDecl(FT)); + for (const auto *Method : InstantiatedMethods) { + if (USRSet.find(getUSRForDecl( + Method->getInstantiatedFromMemberFunction())) != USRSet.end()) + USRSet.insert(getUSRForDecl(Method)); + } + } + bool checkIfOverriddenFunctionAscends(const CXXMethodDecl *MethodDecl) { for (const auto &OverriddenMethod : MethodDecl->overridden_methods()) { if (USRSet.find(getUSRForDecl(OverriddenMethod)) != USRSet.end()) @@ -150,6 +169,7 @@ private: ASTContext &Context; std::set<std::string> USRSet; std::vector<const CXXMethodDecl *> OverriddenMethods; + std::vector<const CXXMethodDecl *> InstantiatedMethods; std::vector<const ClassTemplatePartialSpecializationDecl *> PartialSpecs; }; } // namespace diff --git a/clang/test/clang-rename/TemplatedClassFunction.cpp b/clang/test/clang-rename/TemplatedClassFunction.cpp index 1f5b0b52ba7..d7f21e0847c 100644 --- a/clang/test/clang-rename/TemplatedClassFunction.cpp +++ b/clang/test/clang-rename/TemplatedClassFunction.cpp @@ -6,17 +6,22 @@ public: int main(int argc, char **argv) { A<int> a; - a.foo(); /* Test 2 */ // CHECK: a.bar() /* Test 2 */ + A<double> b; + A<float> c; + a.foo(); /* Test 2 */ // CHECK: a.bar(); /* Test 2 */ + b.foo(); /* Test 3 */ // CHECK: b.bar(); /* Test 3 */ + c.foo(); /* Test 4 */ // CHECK: c.bar(); /* Test 4 */ return 0; } // Test 1. -// RUN: clang-refactor rename -offset=48 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s +// RUN: clang-rename -offset=48 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s // Test 2. -// RUN: clang-refactor rename -offset=162 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s -// -// Currently unsupported test. -// XFAIL: * +// RUN: clang-rename -offset=191 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s +// Test 3. +// RUN: clang-rename -offset=255 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s +// Test 4. +// RUN: clang-rename -offset=319 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s // To find offsets after modifying the file, use: // grep -Ubo 'foo.*' <file> |