void TemplateArgToInt::handleTemplateArgumentLocs( const TemplateDecl *D, const TemplateArgumentLoc *TAL, unsigned NumArgs) { TransAssert(D && "NULL TemplateDecl!"); if (!TAL) return; TemplateParameterIdxSet *InvalidIdx = DeclToParamIdx[dyn_cast<TemplateDecl>(D->getCanonicalDecl())]; if (!InvalidIdx) return; for (unsigned I = 0; I < NumArgs; ++I) { if (!InvalidIdx->count(I)) handleOneTemplateArgumentLoc(TAL[I]); } }
void TemplateArgToInt::handleTemplateSpecializationTypeLoc( const TemplateSpecializationTypeLoc &TLoc) { const Type *Ty = TLoc.getTypePtr(); const TemplateSpecializationType *TST = Ty->getAs<TemplateSpecializationType>(); TemplateName TplName = TST->getTemplateName(); const TemplateDecl *TplD = TplName.getAsTemplateDecl(); TemplateParameterIdxSet *InvalidIdx = DeclToParamIdx[dyn_cast<TemplateDecl>(TplD->getCanonicalDecl())]; if (!InvalidIdx) return; for (unsigned I = 0; I < TLoc.getNumArgs(); ++I) { if (!InvalidIdx->count(I)) handleOneTemplateArgumentLoc(TLoc.getArgLoc(I)); } }
void TemplateArgToInt::collectInvalidParamIdx( const TemplateDecl *D, TemplateParameterIdxSet &InvalidParamIdx) { TemplateParameterSet InvalidParams; NamedDecl *ND = D->getTemplatedDecl(); TemplateInvalidParameterVisitor ParameterVisitor(InvalidParams, this); ParameterVisitor.TraverseDecl(ND); TemplateParameterList *TPList = D->getTemplateParameters(); unsigned Idx = 0; for (TemplateParameterList::const_iterator I = TPList->begin(), E = TPList->end(); I != E; ++I) { const NamedDecl *ParamND = (*I); ParamToTemplateDecl[ParamND] = D; if (InvalidParams.count(ParamND)) { TransAssert(!InvalidParamIdx.count(Idx) && "Duplicate Index!"); InvalidParamIdx.insert(Idx); } Idx++; } }