From: Douglas Gregor Date: Thu, 11 Jun 2009 00:06:24 +0000 (+0000) Subject: Separate TemplateArgument instantiation logic into its own function. No functionality... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=913330004126031920bbceae577dce659514d58e;p=clang Separate TemplateArgument instantiation logic into its own function. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73176 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index ac8997d3b3..866f898391 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -2307,6 +2307,8 @@ public: TemplateName InstantiateTemplateName(TemplateName Name, SourceLocation Loc, const TemplateArgumentList &TemplateArgs); + TemplateArgument Instantiate(TemplateArgument Arg, + const TemplateArgumentList &TemplateArgs); void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function); diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 9a3d9e0160..ee74b9a8bd 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -553,37 +553,11 @@ InstantiateTemplateSpecializationType( InstantiatedTemplateArgs.reserve(T->getNumArgs()); for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end(); Arg != ArgEnd; ++Arg) { - switch (Arg->getKind()) { - case TemplateArgument::Null: - assert(false && "Should never have a NULL template argument"); - break; - - case TemplateArgument::Type: { - QualType T = SemaRef.InstantiateType(Arg->getAsType(), - TemplateArgs, - Arg->getLocation(), - DeclarationName()); - if (T.isNull()) - return QualType(); - - InstantiatedTemplateArgs.push_back( - TemplateArgument(Arg->getLocation(), T)); - break; - } - - case TemplateArgument::Declaration: - case TemplateArgument::Integral: - InstantiatedTemplateArgs.push_back(*Arg); - break; + TemplateArgument InstArg = SemaRef.Instantiate(*Arg, TemplateArgs); + if (InstArg.isNull()) + return QualType(); - case TemplateArgument::Expression: - Sema::OwningExprResult E - = SemaRef.InstantiateExpr(Arg->getAsExpr(), TemplateArgs); - if (E.isInvalid()) - return QualType(); - InstantiatedTemplateArgs.push_back(E.takeAs()); - break; - } + InstantiatedTemplateArgs.push_back(InstArg); } // FIXME: We're missing the locations of the template name, '<', and '>'. @@ -1097,3 +1071,38 @@ Sema::InstantiateTemplateName(TemplateName Name, SourceLocation Loc, // Decl. However, this won't be needed until we implement member templates. return Name; } + +TemplateArgument Sema::Instantiate(TemplateArgument Arg, + const TemplateArgumentList &TemplateArgs) { + switch (Arg.getKind()) { + case TemplateArgument::Null: + assert(false && "Should never have a NULL template argument"); + break; + + case TemplateArgument::Type: { + QualType T = InstantiateType(Arg.getAsType(), TemplateArgs, + Arg.getLocation(), DeclarationName()); + if (T.isNull()) + return TemplateArgument(); + + return TemplateArgument(Arg.getLocation(), T); + } + + case TemplateArgument::Declaration: + // FIXME: Template instantiation for template template parameters. + return Arg; + + case TemplateArgument::Integral: + return Arg; + + case TemplateArgument::Expression: { + Sema::OwningExprResult E = InstantiateExpr(Arg.getAsExpr(), TemplateArgs); + if (E.isInvalid()) + return TemplateArgument(); + return TemplateArgument(E.takeAs()); + } + } + + assert(false && "Unhandled template argument kind"); + return TemplateArgument(); +}