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> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits