aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2012-05-11 08:22:16 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2012-05-11 08:22:16 +0000
commitd10938172fb99885e54d32a3be39ee9369b6dc1a (patch)
tree04bd13a6b3635259564b6b8bfd628b45bd3301f9
parent5450a88f8ba4e2e561330b5ed45ffff008f2f730 (diff)
downloadgcc-d10938172fb99885e54d32a3be39ee9369b6dc1a.zip
gcc-d10938172fb99885e54d32a3be39ee9369b6dc1a.tar.gz
gcc-d10938172fb99885e54d32a3be39ee9369b6dc1a.tar.bz2
re PR c++/53305 (internal crash with variadic templates and decltype)
/cp 2012-05-11 Paolo Carlini <paolo.carlini@oracle.com> PR c++/53305 * pt.c (tsubst_copy: case PARM_DECL): Return error_mark_node if tsubst_decl returns NULL_TREE. * cxx-pretty-print.c (pp_cxx_simple_type_specifier): Handle BOUND_TEMPLATE_TEMPLATE_PARM. /testsuite 2012-05-11 Paolo Carlini <paolo.carlini@oracle.com> PR c++/53305 * g++.dg/cpp0x/variadic132.C: New. From-SVN: r187396
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/cxx-pretty-print.c1
-rw-r--r--gcc/cp/pt.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic132.C27
5 files changed, 44 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 99b1eb5..dfb3204 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2012-05-11 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/53305
+ * pt.c (tsubst_copy: case PARM_DECL): Return error_mark_node if
+ tsubst_decl returns NULL_TREE.
+ * cxx-pretty-print.c (pp_cxx_simple_type_specifier): Handle
+ BOUND_TEMPLATE_TEMPLATE_PARM.
+
2012-05-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/53158
diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c
index 3d10afb..cb7922f 100644
--- a/gcc/cp/cxx-pretty-print.c
+++ b/gcc/cp/cxx-pretty-print.c
@@ -1261,6 +1261,7 @@ pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t)
case TEMPLATE_TYPE_PARM:
case TEMPLATE_TEMPLATE_PARM:
case TEMPLATE_PARM_INDEX:
+ case BOUND_TEMPLATE_TEMPLATE_PARM:
pp_cxx_unqualified_id (pp, t);
break;
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 08b0ad6..a506a84 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -12066,7 +12066,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
case PARM_DECL:
r = retrieve_local_specialization (t);
- if (r == NULL)
+ if (r == NULL_TREE)
{
tree c;
@@ -12084,6 +12084,8 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
not the following PARM_DECLs that are chained to T. */
c = copy_node (t);
r = tsubst_decl (c, args, complain);
+ if (r == NULL_TREE)
+ return error_mark_node;
/* Give it the template pattern as its context; its true context
hasn't been instantiated yet and this is good enough for
mangling. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e4e5611..c0ed0e4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-11 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/53305
+ * g++.dg/cpp0x/variadic132.C: New.
+
2012-05-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/53158
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic132.C b/gcc/testsuite/g++.dg/cpp0x/variadic132.C
new file mode 100644
index 0000000..f50c7a6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic132.C
@@ -0,0 +1,27 @@
+// PR c++/53305
+// { dg-do compile { target c++11 } }
+
+template<class... Ts> struct tuple { };
+
+struct funct
+{
+ template<class... argTs>
+ int operator()(argTs...);
+};
+
+template<class...> class test;
+
+template<template <class...> class tp,
+ class... arg1Ts, class... arg2Ts>
+class test<tp<arg1Ts...>, tp<arg2Ts...>>
+{
+ template<class func, class...arg3Ts>
+ auto test2(func fun, arg1Ts... arg1s, arg3Ts... arg3s)
+ -> decltype(fun(arg1s..., arg3s...));
+};
+
+int main()
+{
+ test<tuple<>, tuple<char,int>> t2;
+ t2.test2(funct(), 'a', 2); // { dg-error "no matching function" }
+}