diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-05-23 16:27:42 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-05-23 16:27:42 +0000 |
commit | fcbae3a308a168b8eea9011c3092d5114253c4c7 (patch) | |
tree | e8b57ad0dd613f4e0a236502ba85e69787cf88be /clang/lib/Index/IndexingContext.cpp | |
parent | 73e27a603101e77cfceb34540ff51fac292f250e (diff) | |
download | bcm5719-llvm-fcbae3a308a168b8eea9011c3092d5114253c4c7.tar.gz bcm5719-llvm-fcbae3a308a168b8eea9011c3092d5114253c4c7.zip |
[index] The references to type aliases and typedefs from template
instantiations should refer to the pattern type aliases / typedefs in the base
templates
rdar://32325459
llvm-svn: 303648
Diffstat (limited to 'clang/lib/Index/IndexingContext.cpp')
-rw-r--r-- | clang/lib/Index/IndexingContext.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/clang/lib/Index/IndexingContext.cpp b/clang/lib/Index/IndexingContext.cpp index 1a341b04c43..5b5270df992 100644 --- a/clang/lib/Index/IndexingContext.cpp +++ b/clang/lib/Index/IndexingContext.cpp @@ -127,7 +127,7 @@ bool IndexingContext::isTemplateImplicitInstantiation(const Decl *D) { } else if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) { if (RD->getInstantiatedFromMemberClass()) TKind = RD->getTemplateSpecializationKind(); - } else if (isa<FieldDecl>(D)) { + } else if (isa<FieldDecl>(D) || isa<TypedefNameDecl>(D)) { if (const auto *Parent = dyn_cast<Decl>(D->getDeclContext())) return isTemplateImplicitInstantiation(Parent); } @@ -177,14 +177,15 @@ static const Decl *adjustTemplateImplicitInstantiation(const Decl *D) { return VD->getTemplateInstantiationPattern(); } else if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) { return RD->getInstantiatedFromMemberClass(); - } else if (const auto *FD = dyn_cast<FieldDecl>(D)) { + } else if (isa<FieldDecl>(D) || isa<TypedefNameDecl>(D)) { + const auto *ND = cast<NamedDecl>(D); if (const CXXRecordDecl *Pattern = - getDeclContextForTemplateInstationPattern(FD)) { - for (const NamedDecl *ND : Pattern->lookup(FD->getDeclName())) { - if (ND->isImplicit()) + getDeclContextForTemplateInstationPattern(ND)) { + for (const NamedDecl *BaseND : Pattern->lookup(ND->getDeclName())) { + if (BaseND->isImplicit()) continue; - if (isa<FieldDecl>(ND)) - return ND; + if (BaseND->getKind() == ND->getKind()) + return BaseND; } } } |