diff --git a/clang-tools-extra/clangd/refactor/Rename.cpp b/clang-tools-extra/clangd/refactor/Rename.cpp --- a/clang-tools-extra/clangd/refactor/Rename.cpp +++ b/clang-tools-extra/clangd/refactor/Rename.cpp @@ -100,14 +100,13 @@ return canonicalRenameDecl(Method->getParent()); if (const FunctionDecl *InstantiatedMethod = Method->getInstantiatedFromMemberFunction()) - Method = cast(InstantiatedMethod); + return canonicalRenameDecl(InstantiatedMethod); // FIXME(kirillbobyrev): For virtual methods with // size_overridden_methods() > 1, this will not rename all functions it // overrides, because this code assumes there is a single canonical // declaration. - while (Method->isVirtual() && Method->size_overridden_methods()) - Method = *Method->overridden_methods().begin(); - return Method->getCanonicalDecl(); + if (Method->isVirtual() && Method->size_overridden_methods()) + return canonicalRenameDecl(*Method->overridden_methods().begin()); } if (const auto *Function = dyn_cast(D)) if (const FunctionTemplateDecl *Template = Function->getPrimaryTemplate()) @@ -132,8 +131,7 @@ } if (const auto *VD = dyn_cast(D)) { if (const VarDecl *OriginalVD = VD->getInstantiatedFromStaticDataMember()) - VD = OriginalVD; - return VD->getCanonicalDecl(); + return canonicalRenameDecl(OriginalVD); } return dyn_cast(D->getCanonicalDecl()); } diff --git a/clang-tools-extra/clangd/unittests/RenameTests.cpp b/clang-tools-extra/clangd/unittests/RenameTests.cpp --- a/clang-tools-extra/clangd/unittests/RenameTests.cpp +++ b/clang-tools-extra/clangd/unittests/RenameTests.cpp @@ -1515,17 +1515,22 @@ } )cpp", }, - // FIXME: triggers an assertion failure due to a bug in canonicalization. - // See https://reviews.llvm.org/D132797 -#if 0 { // virtual templated method R"cpp( template class Foo { virtual void [[m]](); }; class Bar : Foo { void [[^m]]() override; }; - )cpp", "" + )cpp", + R"cpp( + #include "foo.h" + + template void Foo::[[m]]() {} + // FIXME: not renamed as the index doesn't see this as an override of + // the canonical Foo::m(). + // https://github.com/clangd/clangd/issues/1325 + class Baz : Foo { void m() override; }; + )cpp" }, -#endif { // rename on constructor and destructor. R"cpp(