diff options
| author | Ilya Biryukov <ibiryukov@google.com> | 2019-05-23 16:48:47 +0000 | 
|---|---|---|
| committer | Ilya Biryukov <ibiryukov@google.com> | 2019-05-23 16:48:47 +0000 | 
| commit | 346758407e1dabb0d68af6bae7fba131b74e4e54 (patch) | |
| tree | 626f6efc99cb0e4da08bb5ccee2298878ce05127 | |
| parent | fd11a5f47d00dd6176938a3767fd902742617a1e (diff) | |
| download | bcm5719-llvm-346758407e1dabb0d68af6bae7fba131b74e4e54.tar.gz bcm5719-llvm-346758407e1dabb0d68af6bae7fba131b74e4e54.zip | |
[Index] Fix reported references in presence of template type aliases
Summary: See the added test for an example.
Reviewers: kadircet
Reviewed By: kadircet
Subscribers: jkorous, arphaman, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D62303
llvm-svn: 361511
| -rw-r--r-- | clang-tools-extra/clangd/unittests/XRefsTests.cpp | 11 | ||||
| -rw-r--r-- | clang/lib/Index/IndexTypeSourceInfo.cpp | 44 | 
2 files changed, 39 insertions, 16 deletions
| diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index 77fa042c527..2badcffd04c 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -497,6 +497,17 @@ TEST(LocateSymbol, Ambiguous) {                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". diff --git a/clang/lib/Index/IndexTypeSourceInfo.cpp b/clang/lib/Index/IndexTypeSourceInfo.cpp index 9f9740b6079..959d5f1197f 100644 --- a/clang/lib/Index/IndexTypeSourceInfo.cpp +++ b/clang/lib/Index/IndexTypeSourceInfo.cpp @@ -133,29 +133,41 @@ public:      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) { | 

