[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