From c343d5a73197df34694a7c6eaebc4ae28081d8bb Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 11 Oct 2007 09:39:41 +0000 Subject: [PATCH] re PR c++/31441 (ICE with variadic template and specialization) /testsuite 2007-10-11 Paolo Carlini PR c++/31441 * g++.dg/cpp0x/variadic83.C: New. /cp 2007-10-11 Paolo Carlini PR c++/33461 * pt.c (coerce_template_parameter_pack): Do not pass error_mark_node to convert_template_argument. (coerce_template_parms): Return error_mark_node after fixed-length error. (tsubst_decl): Check for error_mark_node the return value of the first tsubst in 'case VAR_DECL'. /testsuite 2007-10-11 Paolo Carlini PR c++/33461 * g++.dg/cpp0x/variadic81.C: New. * g++.dg/cpp0x/variadic82.C: Likewise. From-SVN: r129229 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/pt.c | 10 +++++++--- gcc/testsuite/ChangeLog | 11 +++++++++++ gcc/testsuite/g++.dg/cpp0x/variadic81.C | 11 +++++++++++ gcc/testsuite/g++.dg/cpp0x/variadic82.C | 11 +++++++++++ gcc/testsuite/g++.dg/cpp0x/variadic83.C | 8 ++++++++ 6 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic81.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic82.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic83.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4f737229412..1aeacba8b96 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2007-10-11 Paolo Carlini + + PR c++/33461 + * pt.c (coerce_template_parameter_pack): Do not pass error_mark_node + to convert_template_argument. + (coerce_template_parms): Return error_mark_node after fixed-length + error. + (tsubst_decl): Check for error_mark_node the return value of the + first tsubst in 'case VAR_DECL'. + 2007-10-08 Ollie Wild * typeck2.c (digest_init): Call cplus_expand_constant after diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 5b07c7027a7..fe2a739d40c 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -4933,9 +4933,10 @@ coerce_template_parameter_pack (tree parms, TREE_VEC_ELT (packed_types, arg_idx - parm_idx); } - arg = convert_template_argument (actual_parm, - arg, new_args, complain, parm_idx, - in_decl); + if (arg != error_mark_node) + arg = convert_template_argument (actual_parm, + arg, new_args, complain, parm_idx, + in_decl); if (arg == error_mark_node) (*lost)++; TREE_VEC_ELT (packed_args, arg_idx - parm_idx) = arg; @@ -5086,6 +5087,7 @@ coerce_template_parms (tree parms, else error ("cannot expand %<%T%> into a fixed-length " "argument list", arg); + return error_mark_node; } } else if (require_all_args) @@ -8087,6 +8089,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) TYPE_NAME is not correct for the above test if we've copied the type for a typedef. */ type = tsubst (TREE_TYPE (t), args, complain, in_decl); + if (type == error_mark_node) + return error_mark_node; r = TYPE_NAME (type); break; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index efb4ca4f8ec..5129625c163 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2007-10-11 Paolo Carlini + + PR c++/31441 + * g++.dg/cpp0x/variadic83.C: New. + +2007-10-11 Paolo Carlini + + PR c++/33461 + * g++.dg/cpp0x/variadic81.C: New. + * g++.dg/cpp0x/variadic82.C: Likewise. + 2007-10-11 Richard Guenther PR middle-end/33724 diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic81.C b/gcc/testsuite/g++.dg/cpp0x/variadic81.C new file mode 100644 index 00000000000..d710128df49 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic81.C @@ -0,0 +1,11 @@ +// PR c++/33461 +// { dg-options "-std=gnu++0x" } + +template struct A; + +template struct A // { dg-error "not expanded|note" } +{ // { dg-error "not expanded|note" } + struct B; +}; + +A a; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic82.C b/gcc/testsuite/g++.dg/cpp0x/variadic82.C new file mode 100644 index 00000000000..5acbc83a060 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic82.C @@ -0,0 +1,11 @@ +// PR c++/33461 +// { dg-options "-std=gnu++0x" } + +template struct A; + +template struct A // { dg-error "cannot expand" } +{ + struct B; +}; + +A a; // { dg-error "incomplete type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic83.C b/gcc/testsuite/g++.dg/cpp0x/variadic83.C new file mode 100644 index 00000000000..ec6cabd4e40 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic83.C @@ -0,0 +1,8 @@ +// PR c++/31441 +// { dg-options "-std=gnu++0x" } + +template struct A; + +template struct A { }; // { dg-error "cannot expand" } + +A a; // { dg-error "incomplete type" }