void ReduceClassTemplateParameter::removeOneParameterByArgTemplate( const ClassTemplatePartialSpecializationDecl *PartialD, const TemplateArgument &Arg) { TransAssert((Arg.getKind() == TemplateArgument::Template) && "Arg is not TemplateArgument::Template!"); TemplateName TmplName = Arg.getAsTemplate(); TransAssert((TmplName.getKind() == TemplateName::Template) && "Invalid TemplateName Kind!"); const TemplateDecl *TmplD = TmplName.getAsTemplateDecl(); const TemplateParameterList *TPList = PartialD->getTemplateParameters(); unsigned Idx = 0; for (TemplateParameterList::const_iterator I = TPList->begin(), E = TPList->end(); I != E; ++I) { if ((*I) == TmplD) break; Idx++; } unsigned NumParams = TPList->size(); TransAssert((Idx < NumParams) && "Cannot find valid TemplateParameter!"); (void)NumParams; SourceRange Range = TmplD->getSourceRange(); removeParameterByRange(Range, TPList, Idx); return; }
void ODRHash::AddTemplateName(TemplateName Name) { auto Kind = Name.getKind(); ID.AddInteger(Kind); switch (Kind) { case TemplateName::Template: AddDecl(Name.getAsTemplateDecl()); break; // TODO: Support these cases. case TemplateName::OverloadedTemplate: case TemplateName::QualifiedTemplate: case TemplateName::DependentTemplate: case TemplateName::SubstTemplateTemplateParm: case TemplateName::SubstTemplateTemplateParmPack: break; } }
const NamedDecl *ReduceClassTemplateParameter::getNamedDecl( const TemplateArgument &Arg) { if (!Arg.isInstantiationDependent()) return NULL; TemplateArgument::ArgKind K = Arg.getKind(); switch (K) { case TemplateArgument::Expression: { const Expr *E = Arg.getAsExpr(); if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) { return dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl()); } else { return NULL; } } case TemplateArgument::Template: { TemplateName TmplName = Arg.getAsTemplate(); TransAssert((TmplName.getKind() == TemplateName::Template) && "Invalid TemplateName Kind!"); return TmplName.getAsTemplateDecl(); } case TemplateArgument::Type: { const Type *Ty = Arg.getAsType().getTypePtr(); if (const TemplateTypeParmType *TmplTy = dyn_cast<TemplateTypeParmType>(Ty)) { return TmplTy->getDecl(); } else { return NULL; } } default: return NULL; } TransAssert(0 && "Unreachable code!"); return NULL; }