diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-10 07:32:04 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-10 07:32:04 +0000 |
commit | d3731198193eee92796ddeb493973b7a598b003e (patch) | |
tree | 2e177b315fbcbb6cbfbeb16e30171da0cc1e2e3f /lib/Sema/SemaTemplateInstantiateDecl.cpp | |
parent | 2770eb1294f425710e5802011e302a91a3614eb2 (diff) |
Work-in-progress implementation of C++0x [temp.arg.explicit]p9, which
allows an argument pack determines via explicit specification of
function template arguments to be extended by further, deduced
arguments. For example:
template<class ... Types> void f(Types ... values);
void g() {
f<int*, float*>(0, 0, 0); // Types is deduced to the sequence int*, float*, int
}
There are a number of FIXMEs in here that indicate places where we
need to implement + test retained expansions, plus a number of other
places in deduction where we need to correctly cope with the
explicitly-specified arguments when deducing an argument
pack. Furthermore, it appears that the RecursiveASTVisitor needs to be
auditied; it's missing some traversals (especially w.r.t. template
arguments) that cause it not to find unexpanded parameter packs when
it should.
The good news, however, is that the tr1::tuple implementation now
works fully, and the tr1::bind example (both from N2080) is actually
working now.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123163 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplateInstantiateDecl.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateDecl.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index e59f94a2ca..c29ff865b2 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -1973,13 +1973,16 @@ TemplateDeclInstantiator::InitFunctionInstantiation(FunctionDecl *New, "Pack expansion without parameter packs?"); bool Expand = false; + bool RetainExpansion = false; unsigned NumExpansions = 0; if (SemaRef.CheckParameterPacksForExpansion(New->getLocation(), SourceRange(), Unexpanded.data(), Unexpanded.size(), TemplateArgs, - Expand, NumExpansions)) + Expand, + RetainExpansion, + NumExpansions)) break; if (!Expand) { @@ -2377,12 +2380,14 @@ Sema::InstantiateMemInitializers(CXXConstructorDecl *New, llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded; collectUnexpandedParameterPacks(BaseTL, Unexpanded); bool ShouldExpand = false; + bool RetainExpansion = false; unsigned NumExpansions = 0; if (CheckParameterPacksForExpansion(Init->getEllipsisLoc(), BaseTL.getSourceRange(), Unexpanded.data(), Unexpanded.size(), TemplateArgs, ShouldExpand, + RetainExpansion, NumExpansions)) { AnyErrors = true; New->setInvalidDecl(); |