diff options
author | Paolo Carlini <pcarlini@suse.de> | 2007-10-11 09:39:41 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2007-10-11 09:39:41 +0000 |
commit | c343d5a73197df34694a7c6eaebc4ae28081d8bb (patch) | |
tree | c5426eba18dae184c5aa3a4090afb67db54c2eb6 /gcc | |
parent | 20dcff2aec49d4274cf4564186ca11b78c01f4de (diff) | |
download | gcc-c343d5a73197df34694a7c6eaebc4ae28081d8bb.zip gcc-c343d5a73197df34694a7c6eaebc4ae28081d8bb.tar.gz gcc-c343d5a73197df34694a7c6eaebc4ae28081d8bb.tar.bz2 |
re PR c++/31441 (ICE with variadic template and specialization)
/testsuite
2007-10-11 Paolo Carlini <pcarlini@suse.de>
PR c++/31441
* g++.dg/cpp0x/variadic83.C: New.
/cp
2007-10-11 Paolo Carlini <pcarlini@suse.de>
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 <pcarlini@suse.de>
PR c++/33461
* g++.dg/cpp0x/variadic81.C: New.
* g++.dg/cpp0x/variadic82.C: Likewise.
From-SVN: r129229
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/pt.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic81.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic82.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic83.C | 8 |
6 files changed, 58 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4f73722..1aeacba 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2007-10-11 Paolo Carlini <pcarlini@suse.de> + + 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 <aaw@google.com> * typeck2.c (digest_init): Call cplus_expand_constant after diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 5b07c70..fe2a739 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 efb4ca4..5129625 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2007-10-11 Paolo Carlini <pcarlini@suse.de> + + PR c++/31441 + * g++.dg/cpp0x/variadic83.C: New. + +2007-10-11 Paolo Carlini <pcarlini@suse.de> + + PR c++/33461 + * g++.dg/cpp0x/variadic81.C: New. + * g++.dg/cpp0x/variadic82.C: Likewise. + 2007-10-11 Richard Guenther <rguenther@suse.de> 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 0000000..d710128 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic81.C @@ -0,0 +1,11 @@ +// PR c++/33461 +// { dg-options "-std=gnu++0x" } + +template<typename> struct A; + +template<typename... T> struct A<T*> // { dg-error "not expanded|note" } +{ // { dg-error "not expanded|note" } + struct B; +}; + +A<void*> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic82.C b/gcc/testsuite/g++.dg/cpp0x/variadic82.C new file mode 100644 index 0000000..5acbc83 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic82.C @@ -0,0 +1,11 @@ +// PR c++/33461 +// { dg-options "-std=gnu++0x" } + +template<typename> struct A; + +template<typename... T> struct A<T*...> // { dg-error "cannot expand" } +{ + struct B; +}; + +A<void*> 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 0000000..ec6cabd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic83.C @@ -0,0 +1,8 @@ +// PR c++/31441 +// { dg-options "-std=gnu++0x" } + +template<typename> struct A; + +template<typename... T> struct A<T...> { }; // { dg-error "cannot expand" } + +A<int> a; // { dg-error "incomplete type" } |