[clang-tools-extra] a7fd548 - [clang-rename] Fix the missing template constructors.
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 11 00:47:39 PST 2020
Author: Haojian Wu
Date: 2020-02-11T09:41:39+01:00
New Revision: a7fd548a4f9e50e1aa2def57bae885604c9c5878
URL: https://github.com/llvm/llvm-project/commit/a7fd548a4f9e50e1aa2def57bae885604c9c5878
DIFF: https://github.com/llvm/llvm-project/commit/a7fd548a4f9e50e1aa2def57bae885604c9c5878.diff
LOG: [clang-rename] Fix the missing template constructors.
Summary:
When renaming a class with template constructors, we are missing the
occurrences of the template constructors, because getUSRsForDeclaration doesn't
give USRs of the templated constructors (they are not in the normal `ctors()`
method).
Reviewers: kbobyrev
Subscribers: jkorous, arphaman, kadircet, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D74216
Added:
Modified:
clang-tools-extra/clangd/unittests/RenameTests.cpp
clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp
clang/test/clang-rename/Ctor.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/unittests/RenameTests.cpp b/clang-tools-extra/clangd/unittests/RenameTests.cpp
index fb6993ef0d40..0314a6fabe42 100644
--- a/clang-tools-extra/clangd/unittests/RenameTests.cpp
+++ b/clang-tools-extra/clangd/unittests/RenameTests.cpp
@@ -137,6 +137,17 @@ TEST(RenameTest, WithinFileRename) {
};
)cpp",
+ // Rename template class constructor.
+ R"cpp(
+ class [[F^oo]] {
+ template<typename T>
+ [[Fo^o]]();
+
+ template<typename T>
+ [[F^oo]](T t);
+ };
+ )cpp",
+
// Class in template argument.
R"cpp(
class [[F^oo]] {};
diff --git a/clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp b/clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp
index d966a5ef23c2..a17b880a71a0 100644
--- a/clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp
+++ b/clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp
@@ -135,6 +135,13 @@ class AdditionalUSRFinder : public RecursiveASTVisitor<AdditionalUSRFinder> {
for (const auto *CtorDecl : RecordDecl->ctors())
USRSet.insert(getUSRForDecl(CtorDecl));
+ // Add template constructor decls, they are not in ctors() unfortunately.
+ if (RecordDecl->hasUserDeclaredConstructor())
+ for (const auto *D : RecordDecl->decls())
+ if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
+ if (const auto *Ctor =
+ dyn_cast<CXXConstructorDecl>(FTD->getTemplatedDecl()))
+ USRSet.insert(getUSRForDecl(Ctor));
USRSet.insert(getUSRForDecl(RecordDecl->getDestructor()));
USRSet.insert(getUSRForDecl(RecordDecl));
diff --git a/clang/test/clang-rename/Ctor.cpp b/clang/test/clang-rename/Ctor.cpp
index 9908a4123ddf..1213cc6a239d 100644
--- a/clang/test/clang-rename/Ctor.cpp
+++ b/clang/test/clang-rename/Ctor.cpp
@@ -5,10 +5,23 @@ class Foo { // CHECK: class Bar {
Foo::Foo() /* Test 2 */ {} // CHECK: Bar::Bar() /* Test 2 */ {}
+
+class Foo2 { /* Test 3 */ // CHECK: class Bar2 {
+public:
+ template <typename T>
+ Foo2(); // CHECK: Bar2();
+
+ template <typename T>
+ Foo2(Foo2 &); // CHECK: Bar2(Bar2 &);
+};
+
+
// Test 1.
// RUN: clang-rename -offset=62 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
// Test 2.
// RUN: clang-rename -offset=116 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
+// Test 3.
+// RUN: clang-rename -offset=187 -new-name=Bar2 %s -- | sed 's,//.*,,' | FileCheck %s
// To find offsets after modifying the file, use:
// grep -Ubo 'Foo.*' <file>
More information about the cfe-commits
mailing list