aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2007-10-11 09:39:41 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2007-10-11 09:39:41 +0000
commitc343d5a73197df34694a7c6eaebc4ae28081d8bb (patch)
treec5426eba18dae184c5aa3a4090afb67db54c2eb6 /gcc
parent20dcff2aec49d4274cf4564186ca11b78c01f4de (diff)
downloadgcc-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/ChangeLog10
-rw-r--r--gcc/cp/pt.c10
-rw-r--r--gcc/testsuite/ChangeLog11
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic81.C11
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic82.C11
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic83.C8
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" }