diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-06-11 00:06:24 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-06-11 00:06:24 +0000 |
commit | 913330004126031920bbceae577dce659514d58e (patch) | |
tree | 76b3c4592139dda510bff1da969faad1a8c17493 /lib/Sema/SemaTemplateInstantiate.cpp | |
parent | 637a4097f61b09d6ccf619298d9d121fafa044e4 (diff) |
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
Diffstat (limited to 'lib/Sema/SemaTemplateInstantiate.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateInstantiate.cpp | 69 |
1 files changed, 39 insertions, 30 deletions
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<Expr>()); - 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<Expr>()); + } + } + + assert(false && "Unhandled template argument kind"); + return TemplateArgument(); +} |