Beispiel #1
0
QualType ClassTemplateDecl::getInjectedClassNameType(ASTContext &Context) {
    if (!CommonPtr->InjectedClassNameType.isNull())
        return CommonPtr->InjectedClassNameType;

    // FIXME: n2800 14.6.1p1 should say how the template arguments
    // corresponding to template parameter packs should be pack
    // expansions. We already say that in 14.6.2.1p2, so it would be
    // better to fix that redundancy.

    TemplateParameterList *Params = getTemplateParameters();
    llvm::SmallVector<TemplateArgument, 16> TemplateArgs;
    TemplateArgs.reserve(Params->size());
    for (TemplateParameterList::iterator Param = Params->begin(),
            ParamEnd = Params->end();
            Param != ParamEnd; ++Param) {
        if (isa<TemplateTypeParmDecl>(*Param)) {
            QualType ParamType = Context.getTypeDeclType(cast<TypeDecl>(*Param));
            TemplateArgs.push_back(TemplateArgument(ParamType));
        } else if (NonTypeTemplateParmDecl *NTTP =
                       dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
            Expr *E = new (Context) DeclRefExpr(NTTP, NTTP->getType(),
                                                NTTP->getLocation());
            TemplateArgs.push_back(TemplateArgument(E));
        } else {
            TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param);
            TemplateArgs.push_back(TemplateArgument(TemplateName(TTP)));
        }
    }

    CommonPtr->InjectedClassNameType
        = Context.getTemplateSpecializationType(TemplateName(this),
                &TemplateArgs[0],
                TemplateArgs.size());
    return CommonPtr->InjectedClassNameType;
}