}
}
}
-
-/// \brief Return a template specialization of ND (should be a TemplateDecl)
-/// that matches FD or TD.
-static NamedDecl* findMatchingSpecialization(FunctionDecl* FD,
- ClassTemplateSpecializationDecl*TD,
- NamedDecl* ND) {
- TemplateDecl* Templt = dyn_cast<TemplateDecl>(ND);
- if (!Templt) return 0;
- if (FD) {
- FunctionTemplateDecl* FTD = dyn_cast<FunctionTemplateDecl>(Templt);
- if (!FTD) return 0;
- const TemplateArgumentList* TmpltArgs = FD->getTemplateSpecializationArgs();
- assert(TmpltArgs || "Template without arguments");
- void* InsertionPoint;
- return FTD->findSpecialization(TmpltArgs->data(), TmpltArgs->size(),
- InsertionPoint);
- } else {
- ClassTemplateDecl* CTD = dyn_cast<ClassTemplateDecl>(Templt);
- if (!CTD) return 0;
- const TemplateArgumentList& TmpltArgs = TD->getTemplateArgs();
- void* InsertionPoint;
- return CTD->findSpecialization(TmpltArgs.data(), TmpltArgs.size(),
- InsertionPoint);
- }
- return 0;
-}
-
-/// \brief Find out whether an instantiation (outside the module) already exists
-bool ASTReader::needPendingInstantiation(ValueDecl* D) const {
- DeclContext *DC = D->getDeclContext()->getRedeclContext();
- DeclarationName Name = D->getDeclName();
- assert(Name && "unnamed template");
-
- FunctionDecl* FD = dyn_cast<FunctionDecl>(D);
- ClassTemplateSpecializationDecl* CD
- = FD ? 0 : dyn_cast<ClassTemplateSpecializationDecl>(D);
-
- NamedDecl* FoundSpecialization = 0;
- if (DC->isTranslationUnit() && SemaObj) {
- IdentifierResolver &IdResolver = SemaObj->IdResolver;
- for (IdentifierResolver::iterator I = IdResolver.begin(Name),
- IEnd = IdResolver.end();
- I != IEnd && !FoundSpecialization; ++I)
- FoundSpecialization = findMatchingSpecialization(FD, CD, *I);
- } else {
- // templates are redeclarables, i.e. they must have been merged into
- // the primary context. Use localUncachedLookup to not pick up template
- // decls from modules again.
- llvm::SmallVector<NamedDecl*, 6> Results;
- DC->getPrimaryContext()->localUncachedLookup(Name, Results);
- for (llvm::SmallVector<NamedDecl *, 6>::const_iterator
- I = Results.begin(), E = Results.end();
- I != E && FoundSpecialization; ++I)
- FoundSpecialization = findMatchingSpecialization(FD, CD, *I);
- }
- return FoundSpecialization && isSameEntity(FoundSpecialization, D);
-}