mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-21 11:00:41 +08:00
re PR c++/34050 (ICE derived classes and variadic templates)
2008-02-14 Douglas Gregor <doug.gregor@gmail.com> PR c++/34050 * pt.c (tsubst_initializer_list): Deal with the use of VOID_TYPE_NODE to indicate value-initialization of the bases. 2008-02-14 Douglas Gregor <doug.gregor@gmail.com> PR c++/34050 * g++.dg/cpp0x/vt-34050.C: New. From-SVN: r132331
This commit is contained in:
parent
512d1f4b7d
commit
625b6d91e7
@ -1,3 +1,9 @@
|
||||
2008-02-14 Douglas Gregor <doug.gregor@gmail.com>
|
||||
|
||||
PR c++/34050
|
||||
* pt.c (tsubst_initializer_list): Deal with the use of
|
||||
VOID_TYPE_NODE to indicate value-initialization of the bases.
|
||||
|
||||
2008-02-14 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
|
||||
Jason Merrill <jason@redhat.com>
|
||||
|
||||
|
68
gcc/cp/pt.c
68
gcc/cp/pt.c
@ -15190,37 +15190,49 @@ tsubst_initializer_list (tree t, tree argvec)
|
||||
PACK_EXPANSION_PARAMETER_PACKS (expr) =
|
||||
PACK_EXPANSION_PARAMETER_PACKS (TREE_PURPOSE (t));
|
||||
|
||||
/* Substitute parameter packs into each argument in the
|
||||
TREE_LIST. */
|
||||
in_base_initializer = 1;
|
||||
for (arg = TREE_VALUE (t); arg; arg = TREE_CHAIN (arg))
|
||||
{
|
||||
tree expanded_exprs;
|
||||
if (TREE_VALUE (t) == void_type_node)
|
||||
/* VOID_TYPE_NODE is used to indicate
|
||||
value-initialization. */
|
||||
{
|
||||
for (i = 0; i < len; i++)
|
||||
TREE_VEC_ELT (expanded_arguments, i) = void_type_node;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Substitute parameter packs into each argument in the
|
||||
TREE_LIST. */
|
||||
in_base_initializer = 1;
|
||||
for (arg = TREE_VALUE (t); arg; arg = TREE_CHAIN (arg))
|
||||
{
|
||||
tree expanded_exprs;
|
||||
|
||||
/* Expand the argument. */
|
||||
SET_PACK_EXPANSION_PATTERN (expr, TREE_VALUE (arg));
|
||||
expanded_exprs = tsubst_pack_expansion (expr, argvec,
|
||||
tf_warning_or_error,
|
||||
NULL_TREE);
|
||||
/* Expand the argument. */
|
||||
SET_PACK_EXPANSION_PATTERN (expr, TREE_VALUE (arg));
|
||||
expanded_exprs
|
||||
= tsubst_pack_expansion (expr, argvec,
|
||||
tf_warning_or_error,
|
||||
NULL_TREE);
|
||||
|
||||
/* Prepend each of the expanded expressions to the
|
||||
corresponding TREE_LIST in EXPANDED_ARGUMENTS. */
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
TREE_VEC_ELT (expanded_arguments, i) =
|
||||
tree_cons (NULL_TREE, TREE_VEC_ELT (expanded_exprs, i),
|
||||
TREE_VEC_ELT (expanded_arguments, i));
|
||||
}
|
||||
}
|
||||
in_base_initializer = 0;
|
||||
/* Prepend each of the expanded expressions to the
|
||||
corresponding TREE_LIST in EXPANDED_ARGUMENTS. */
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
TREE_VEC_ELT (expanded_arguments, i) =
|
||||
tree_cons (NULL_TREE,
|
||||
TREE_VEC_ELT (expanded_exprs, i),
|
||||
TREE_VEC_ELT (expanded_arguments, i));
|
||||
}
|
||||
}
|
||||
in_base_initializer = 0;
|
||||
|
||||
/* Reverse all of the TREE_LISTs in EXPANDED_ARGUMENTS,
|
||||
since we built them backwards. */
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
TREE_VEC_ELT (expanded_arguments, i) =
|
||||
nreverse (TREE_VEC_ELT (expanded_arguments, i));
|
||||
}
|
||||
/* Reverse all of the TREE_LISTs in EXPANDED_ARGUMENTS,
|
||||
since we built them backwards. */
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
TREE_VEC_ELT (expanded_arguments, i) =
|
||||
nreverse (TREE_VEC_ELT (expanded_arguments, i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < len; ++i)
|
||||
|
@ -1,3 +1,8 @@
|
||||
2008-02-14 Douglas Gregor <doug.gregor@gmail.com>
|
||||
|
||||
PR c++/34050
|
||||
* g++.dg/cpp0x/vt-34050.C: New.
|
||||
|
||||
2008-02-14 Danny Smith <dannysmith@users.sourceforge.net>
|
||||
|
||||
PR preprocessor/35061
|
||||
|
9
gcc/testsuite/g++.dg/cpp0x/vt-34050.C
Normal file
9
gcc/testsuite/g++.dg/cpp0x/vt-34050.C
Normal file
@ -0,0 +1,9 @@
|
||||
// { dg-options "-std=c++0x" }
|
||||
struct A {};
|
||||
|
||||
template<typename... T> struct B : T...
|
||||
{
|
||||
B() : T()... {}
|
||||
};
|
||||
|
||||
B<A> b;
|
Loading…
x
Reference in New Issue
Block a user