Commit b6139926 by Jason Merrill Committed by Jason Merrill

re PR c++/48424 (C++0x parameter packs expansion problem)

	PR c++/48424
	* decl.c (grokparms): Function parameter packs don't need to
	go at the end.
	* pt.c (type_unification_real): But they aren't deduced otherwise.

From-SVN: r174285
parent d11bf18f
2011-05-26 Jason Merrill <jason@redhat.com>
PR c++/48424
* decl.c (grokparms): Function parameter packs don't need to
go at the end.
* pt.c (type_unification_real): But they aren't deduced otherwise.
2011-05-25 Jason Merrill <jason@redhat.com>
PR c++/48536
......
......@@ -10551,12 +10551,6 @@ grokparms (tree parmlist, tree *parms)
init = check_default_argument (decl, init);
}
if (TREE_CODE (decl) == PARM_DECL
&& FUNCTION_PARAMETER_PACK_P (decl)
&& TREE_CHAIN (parm)
&& TREE_CHAIN (parm) != void_list_node)
error ("parameter packs must be at the end of the parameter list");
DECL_CHAIN (decl) = decls;
decls = decl;
result = tree_cons (init, type, result);
......
......@@ -14262,11 +14262,24 @@ type_unification_real (tree tparms,
while (parms && parms != void_list_node
&& ia < nargs)
{
if (TREE_CODE (TREE_VALUE (parms)) == TYPE_PACK_EXPANSION)
break;
parm = TREE_VALUE (parms);
if (TREE_CODE (parm) == TYPE_PACK_EXPANSION
&& (!TREE_CHAIN (parms) || TREE_CHAIN (parms) == void_list_node))
/* For a function parameter pack that occurs at the end of the
parameter-declaration-list, the type A of each remaining
argument of the call is compared with the type P of the
declarator-id of the function parameter pack. */
break;
parms = TREE_CHAIN (parms);
if (TREE_CODE (parm) == TYPE_PACK_EXPANSION)
/* For a function parameter pack that does not occur at the
end of the parameter-declaration-list, the type of the
parameter pack is a non-deduced context. */
continue;
arg = args[ia];
++ia;
arg_expr = NULL;
......
2011-05-26 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/variadic111.C: New.
* g++.dg/cpp0x/variadic41.C: Adjust.
2011-05-26 Richard Guenther <rguenther@suse.de>
PR tree-optimization/48702
......
// PR c++/48424
// { dg-options -std=c++0x }
template<typename... Args1>
struct S
{
template<typename... Args2>
void f(Args1... args1, Args2&&... args2)
{
}
};
int main()
{
S<int, double> s;
s.f(1,2.0,false,'a');
}
// { dg-final { scan-assembler "_ZN1SIIidEE1fIIbcEEEvidDpOT_" } }
// A function parameter pack is only deduced if it's at the end
// { dg-options "-std=gnu++0x" }
template<typename... Args>
void f(const Args&... args, int oops); // { dg-error "end" }
void f(const Args&... args, int oops);
int main()
{
f<>(1);
f(1);
f<int>(1,2);
f(1,2); // { dg-error "no match" }
}
// { dg-prune-output "note" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment