diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-08-04 22:27:00 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-08-04 22:27:00 +0000 |
commit | e922c77ddd586ab59e3a329be0cb6f6e97824217 (patch) | |
tree | 364eeaac1de09c71465e8a37090ef32816b25323 /clang/lib/Sema/SemaTemplateInstantiate.cpp | |
parent | 28c2d9809dbdd0f5b1c11226d9327214136edfe5 (diff) | |
download | bcm5719-llvm-e922c77ddd586ab59e3a329be0cb6f6e97824217.tar.gz bcm5719-llvm-e922c77ddd586ab59e3a329be0cb6f6e97824217.zip |
Move the template instantiation logic for template arguments into the
general tree transformation. Also, implement template instantiation
for parameter packs.
In addition, introduce logic to enter the appropriate context for
subexpressions that are not potentially evaluated.
llvm-svn: 78114
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 49 |
1 files changed, 3 insertions, 46 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index a995181d019..c281b96a9ea 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -331,9 +331,6 @@ namespace { /// \brief Transform the given template name by instantiating it. TemplateName TransformTemplateName(TemplateName Template); - /// \brief Transform the given template argument by instantiating it. - TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg); - /// \brief Transforms a template type parameter type by performing /// substitution of the corresponding template type argument. QualType TransformTemplateTypeParmType(const TemplateTypeParmType *T); @@ -360,11 +357,6 @@ TemplateInstantiator::TransformTemplateName(TemplateName Template) { TemplateArgs); } -TemplateArgument -TemplateInstantiator::TransformTemplateArgument(const TemplateArgument &Arg) { - return getSema().Instantiate(Arg, TemplateArgs); -} - QualType TemplateInstantiator::TransformTemplateTypeParmType( const TemplateTypeParmType *T) { @@ -852,42 +844,7 @@ Sema::InstantiateTemplateName(TemplateName Name, SourceLocation Loc, 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: { - // Template argument expressions are not potentially evaluated. - EnterExpressionEvaluationContext Unevaluated(*this, Action::Unevaluated); - - Sema::OwningExprResult E = InstantiateExpr(Arg.getAsExpr(), TemplateArgs); - if (E.isInvalid()) - return TemplateArgument(); - return TemplateArgument(E.takeAs<Expr>()); - } - - case TemplateArgument::Pack: - assert(0 && "FIXME: Implement!"); - break; - } - - assert(false && "Unhandled template argument kind"); - return TemplateArgument(); + TemplateInstantiator Instantiator(*this, TemplateArgs, SourceLocation(), + DeclarationName()); + return Instantiator.TransformTemplateArgument(Arg); } |