static vector<QualType> typesFromTemplateArguments(const TemplateArgumentList &templateArgs) { vector<QualType> result; const int numArgs = templateArgs.size(); result.reserve(numArgs); for (int i = 0; i < numArgs; ++i) { const TemplateArgument &arg = templateArgs.get(i); if (arg.getKind() == TemplateArgument::Type) result.push_back(arg.getAsType()); } return result; }
void InstantiateTemplateParam::handleOneTemplateSpecialization( const TemplateDecl *D, const TemplateArgumentList & ArgList) { if (isInIncludedFile(D)) return; NamedDecl *ND = D->getTemplatedDecl(); TemplateParameterSet ParamsSet; TemplateParameterVisitor ParameterVisitor(ParamsSet); ParameterVisitor.TraverseDecl(ND); if (ParamsSet.size() == 0) return; unsigned NumArgs = ArgList.size(); (void)NumArgs; unsigned Idx = 0; TemplateParameterList *TPList = D->getTemplateParameters(); for (TemplateParameterList::const_iterator I = TPList->begin(), E = TPList->end(); I != E; ++I) { const NamedDecl *ND = (*I); // make it simple, skip NonTypeTemplateParmDecl and // TemplateTemplateParmDecl for now const TemplateTypeParmDecl *TyParmDecl = dyn_cast<TemplateTypeParmDecl>(ND); if (!TyParmDecl || TyParmDecl->isParameterPack() || !ParamsSet.count(ND)) { Idx++; continue; } TransAssert((Idx < NumArgs) && "Invalid Idx!"); const TemplateArgument &Arg = ArgList.get(Idx); std::string ArgStr; std::string ForwardStr; if (!getTemplateArgumentString(Arg, ArgStr, ForwardStr)) continue; ValidInstanceNum++; if (ValidInstanceNum == TransformationCounter) { TheInstantiationString = ArgStr; TheParameter = ND; TheTemplateDecl = D; TheForwardDeclString = ForwardStr; } } }