summaryrefslogtreecommitdiffstats
path: root/clang/lib/Index/IndexingContext.cpp
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2017-05-23 16:27:42 +0000
committerAlex Lorenz <arphaman@gmail.com>2017-05-23 16:27:42 +0000
commitfcbae3a308a168b8eea9011c3092d5114253c4c7 (patch)
treee8b57ad0dd613f4e0a236502ba85e69787cf88be /clang/lib/Index/IndexingContext.cpp
parent73e27a603101e77cfceb34540ff51fac292f250e (diff)
downloadbcm5719-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.cpp15
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;
}
}
}
OpenPOWER on IntegriCloud