OSDN Git Service

PR c++/50830
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 17 Apr 2012 14:11:13 +0000 (14:11 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 17 Apr 2012 14:11:13 +0000 (14:11 +0000)
* pt.c (convert_template_argument): Handle template template
argument packs.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@186532 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/variadic129.C [new file with mode: 0644]

index d5bbaee..9b2fe30 100644 (file)
@@ -1,5 +1,9 @@
 2012-04-16  Jason Merrill  <jason@redhat.com>
 
+       PR c++/50830
+       * pt.c (convert_template_argument): Handle template template
+       argument packs.
+
        PR c++/50303
        * pt.c (tsubst_pack_expansion): Use tsubst_expr for template
        template parameters.
index ea20323..c96b333 100644 (file)
@@ -6437,6 +6437,7 @@ convert_template_argument (tree parm,
   is_tmpl_type = 
     ((TREE_CODE (arg) == TEMPLATE_DECL
       && TREE_CODE (DECL_TEMPLATE_RESULT (arg)) == TYPE_DECL)
+     || (requires_tmpl_type && TREE_CODE (arg) == TYPE_ARGUMENT_PACK)
      || TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM
      || TREE_CODE (arg) == UNBOUND_CLASS_TEMPLATE);
 
@@ -6508,7 +6509,9 @@ convert_template_argument (tree parm,
     {
       if (requires_tmpl_type)
        {
-         if (TREE_CODE (TREE_TYPE (arg)) == UNBOUND_CLASS_TEMPLATE)
+         if (template_parameter_pack_p (parm) && ARGUMENT_PACK_P (orig_arg))
+           val = orig_arg;
+         else if (TREE_CODE (TREE_TYPE (arg)) == UNBOUND_CLASS_TEMPLATE)
            /* The number of argument required is not known yet.
               Just accept it for now.  */
            val = TREE_TYPE (arg);
index 0c72e98..b62f8e5 100644 (file)
@@ -1,5 +1,8 @@
 2012-04-16  Jason Merrill  <jason@redhat.com>
 
+       PR c++/50830
+       * g++.dg/cpp0x/variadic129.C: New.
+
        PR c++/50303
        * g++.dg/cpp0x/variadic128.C: New.
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic129.C b/gcc/testsuite/g++.dg/cpp0x/variadic129.C
new file mode 100644 (file)
index 0000000..7118301
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/50830
+// { dg-do compile { target c++11 } }
+
+template<template<class> class...>
+struct list_templates {};
+
+template<class>
+struct aa {};
+
+template<class... T>
+struct test {};
+
+template<template<class> class... F, class T>
+struct test<list_templates<F...>, T>
+{
+    struct inner {};
+};
+
+test<list_templates<aa>, int> a4; // error