diff options
| author | Douglas Gregor <dgregor@apple.com> | 2011-01-05 15:48:55 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2011-01-05 15:48:55 +0000 |
| commit | f550077ef5abe24aa34ccba1d3ad5bbcc9387be7 (patch) | |
| tree | 436efb71d09100f5e5664fd7fd444cb44db1e3f5 /clang/lib/Sema/SemaTemplateInstantiate.cpp | |
| parent | c7d65b42fce5969949a6f099fd4fea383cbf69d9 (diff) | |
| download | bcm5719-llvm-f550077ef5abe24aa34ccba1d3ad5bbcc9387be7.tar.gz bcm5719-llvm-f550077ef5abe24aa34ccba1d3ad5bbcc9387be7.zip | |
Implement support for template template parameter packs, e.g.,
template<template<class> class ...Metafunctions>
struct apply_to_each;
llvm-svn: 122874
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiate.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 5d724f3b704..a256537068c 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -697,9 +697,22 @@ Decl *TemplateInstantiator::TransformDecl(SourceLocation Loc, Decl *D) { TTP->getPosition())) return D; - // FIXME: Variadic templates index substitution. - TemplateName Template - = TemplateArgs(TTP->getDepth(), TTP->getPosition()).getAsTemplate(); + TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getPosition()); + + if (TTP->isParameterPack()) { + assert(Arg.getKind() == TemplateArgument::Pack && + "Missing argument pack"); + + if (getSema().ArgumentPackSubstitutionIndex == -1) { + // FIXME: Variadic templates fun case. + getSema().Diag(Loc, diag::err_pack_expansion_mismatch_unsupported); + return 0; + } + + Arg = Arg.pack_begin()[getSema().ArgumentPackSubstitutionIndex]; + } + + TemplateName Template = Arg.getAsTemplate(); assert(!Template.isNull() && Template.getAsTemplateDecl() && "Wrong kind of template template argument"); return Template.getAsTemplateDecl(); |

