From 625b6d91e7fed284c8228c333340ebf7ba6b479a Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 15 Feb 2008 03:09:18 +0000 Subject: re PR c++/34050 (ICE derived classes and variadic templates) 2008-02-14 Douglas Gregor 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 PR c++/34050 * g++.dg/cpp0x/vt-34050.C: New. From-SVN: r132331 --- gcc/cp/ChangeLog | 6 +++ gcc/cp/pt.c | 72 ++++++++++++++++++++--------------- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.dg/cpp0x/vt-34050.C | 9 +++++ 4 files changed, 62 insertions(+), 30 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/vt-34050.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3635512..3853983 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-02-14 Douglas Gregor + + 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 Jason Merrill diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 2e2a636..d11a959 100644 --- a/gcc/cp/pt.c +++ b/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; - - /* 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; + 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); + + /* 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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4c1c8b8..792ae4c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-02-14 Douglas Gregor + + PR c++/34050 + * g++.dg/cpp0x/vt-34050.C: New. + 2008-02-14 Danny Smith PR preprocessor/35061 diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34050.C b/gcc/testsuite/g++.dg/cpp0x/vt-34050.C new file mode 100644 index 0000000..cb19b39 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34050.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } +struct A {}; + +template struct B : T... +{ + B() : T()... {} +}; + +B b; -- cgit v1.1