[PATCH] D62303: [Index] Fix reported references in presence of template type aliases
Phabricator via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu May 23 09:49:02 PDT 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL361511: [Index] Fix reported references in presence of template type aliases (authored by ibiryukov, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Changed prior to commit:
https://reviews.llvm.org/D62303?vs=201002&id=201003#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D62303/new/
https://reviews.llvm.org/D62303
Files:
cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp
Index: cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
===================================================================
--- cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
+++ cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
@@ -133,29 +133,41 @@
return true;
}
- template<typename TypeLocType>
- bool HandleTemplateSpecializationTypeLoc(TypeLocType TL) {
- if (const auto *T = TL.getTypePtr()) {
- if (CXXRecordDecl *RD = T->getAsCXXRecordDecl()) {
- if (!RD->isImplicit() || IndexCtx.shouldIndexImplicitInstantiation()) {
- IndexCtx.handleReference(RD, TL.getTemplateNameLoc(), Parent,
- ParentDC, SymbolRoleSet(), Relations);
- return true;
- }
- }
- if (const TemplateDecl *D = T->getTemplateName().getAsTemplateDecl())
- IndexCtx.handleReference(D, TL.getTemplateNameLoc(), Parent, ParentDC,
- SymbolRoleSet(), Relations);
+ void HandleTemplateSpecializationTypeLoc(TemplateName TemplName,
+ SourceLocation TemplNameLoc,
+ CXXRecordDecl *ResolvedClass,
+ bool IsTypeAlias) {
+ // In presence of type aliases, the resolved class was never written in
+ // the code so don't report it.
+ if (!IsTypeAlias && ResolvedClass &&
+ (!ResolvedClass->isImplicit() ||
+ IndexCtx.shouldIndexImplicitInstantiation())) {
+ IndexCtx.handleReference(ResolvedClass, TemplNameLoc, Parent, ParentDC,
+ SymbolRoleSet(), Relations);
+ } else if (const TemplateDecl *D = TemplName.getAsTemplateDecl()) {
+ IndexCtx.handleReference(D, TemplNameLoc, Parent, ParentDC,
+ SymbolRoleSet(), Relations);
}
- return true;
}
bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
- return HandleTemplateSpecializationTypeLoc(TL);
+ auto *T = TL.getTypePtr();
+ if (!T)
+ return true;
+ HandleTemplateSpecializationTypeLoc(
+ T->getTemplateName(), TL.getTemplateNameLoc(), T->getAsCXXRecordDecl(),
+ T->isTypeAlias());
+ return true;
}
bool VisitDeducedTemplateSpecializationTypeLoc(DeducedTemplateSpecializationTypeLoc TL) {
- return HandleTemplateSpecializationTypeLoc(TL);
+ auto *T = TL.getTypePtr();
+ if (!T)
+ return true;
+ HandleTemplateSpecializationTypeLoc(
+ T->getTemplateName(), TL.getTemplateNameLoc(), T->getAsCXXRecordDecl(),
+ /*IsTypeAlias=*/false);
+ return true;
}
bool VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
Index: clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp
===================================================================
--- clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp
+++ clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp
@@ -497,6 +497,17 @@
ElementsAre(Sym("Foo"), Sym("Foo")));
}
+TEST(LocateSymbol, TemplateTypedefs) {
+ auto T = Annotations(R"cpp(
+ template <class T> struct function {};
+ template <class T> using callback = function<T()>;
+
+ c^allback<int> foo;
+ )cpp");
+ auto AST = TestTU::withCode(T.code()).build();
+ EXPECT_THAT(locateSymbolAt(AST, T.point()), ElementsAre(Sym("callback")));
+}
+
TEST(LocateSymbol, RelPathsInCompileCommand) {
// The source is in "/clangd-test/src".
// We build in "/clangd-test/build".
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62303.201003.patch
Type: text/x-patch
Size: 3490 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190523/5b215820/attachment.bin>
More information about the cfe-commits
mailing list