return canonicalRenameDecl(Method->getParent());
if (const FunctionDecl *InstantiatedMethod =
Method->getInstantiatedFromMemberFunction())
- Method = cast<CXXMethodDecl>(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<FunctionDecl>(D))
if (const FunctionTemplateDecl *Template = Function->getPrimaryTemplate())
}
if (const auto *VD = dyn_cast<VarDecl>(D)) {
if (const VarDecl *OriginalVD = VD->getInstantiatedFromStaticDataMember())
- VD = OriginalVD;
- return VD->getCanonicalDecl();
+ return canonicalRenameDecl(OriginalVD);
}
return dyn_cast<NamedDecl>(D->getCanonicalDecl());
}
}
)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 <typename> class Foo { virtual void [[m]](); };
class Bar : Foo<int> { void [[^m]]() override; };
- )cpp", ""
+ )cpp",
+ R"cpp(
+ #include "foo.h"
+
+ template<typename T> void Foo<T>::[[m]]() {}
+ // FIXME: not renamed as the index doesn't see this as an override of
+ // the canonical Foo<T>::m().
+ // https://github.com/clangd/clangd/issues/1325
+ class Baz : Foo<float> { void m() override; };
+ )cpp"
},
-#endif
{
// rename on constructor and destructor.
R"cpp(