re PR c++/40092 ([c++0x] expansion pattern fails with error about derived template...
authorLarry Evans <cppljevans@suddenlink.net>
Wed, 14 Oct 2009 06:27:41 +0000 (06:27 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 14 Oct 2009 06:27:41 +0000 (02:27 -0400)
PR c++/40092
* tree.c (cp_tree_equal): Add test for TEMPLATE_PARM_PARAMETER_PACK
equality.

From-SVN: r152751

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/vt-40092.C [new file with mode: 0644]

index 7765c73b9de63261061e805de7eda831a63bf8de..06659aa955cb35274d61e274a15bf28f4f7eecab 100644 (file)
@@ -1,3 +1,9 @@
+2009-10-14  Larry Evans  <cppljevans@suddenlink.net>
+
+       PR c++/40092
+       * tree.c (cp_tree_equal): Add test for TEMPLATE_PARM_PARAMETER_PACK
+       equality.
+
 2009-10-12  Jason Merrill  <jason@redhat.com>
 
        PR c++/37875
index 76763735b97870799f9c7d21048c7edc0a2babbf..99ce656207033dbbbc4bd58839f7a6ce27279785 100644 (file)
@@ -2081,6 +2081,8 @@ cp_tree_equal (tree t1, tree t2)
     case TEMPLATE_PARM_INDEX:
       return (TEMPLATE_PARM_IDX (t1) == TEMPLATE_PARM_IDX (t2)
              && TEMPLATE_PARM_LEVEL (t1) == TEMPLATE_PARM_LEVEL (t2)
+             && (TEMPLATE_PARM_PARAMETER_PACK (t1)
+                 == TEMPLATE_PARM_PARAMETER_PACK (t2))
              && same_type_p (TREE_TYPE (TEMPLATE_PARM_DECL (t1)),
                              TREE_TYPE (TEMPLATE_PARM_DECL (t2))));
 
index 4895fc17b0c181d9dfc7f7d1450dd5b3c812ce24..e2a9cfe2a39b376abcd7b60b849cf86fb3001add 100644 (file)
@@ -1,3 +1,7 @@
+2009-10-14  Larry Evans  <cppljevans@suddenlink.net>
+
+       * g++.dg/cpp0x/vt-40092.C: New.
+
 2009-10-14  Alexandre Oliva  <aoliva@redhat.com>
 
        * gcc.dg/guality/pr41616-1.c: Drop -O2.
diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-40092.C b/gcc/testsuite/g++.dg/cpp0x/vt-40092.C
new file mode 100644 (file)
index 0000000..063ed7e
--- /dev/null
@@ -0,0 +1,21 @@
+// { dg-do "compile" }
+// { dg-options "-std=c++0x" }
+
+template <typename... Types> struct package {};
+
+template <int ArgGen> struct wrapper_gen {};
+
+template <int ArgNest> struct wrapper_nest
+{
+  typedef wrapper_gen<ArgNest> type_nest;
+};
+
+template <int... ArgPack>
+struct wrapper_pack
+{
+  typedef package<wrapper_gen <ArgPack>...> type_pack;
+  // incorrect error: expansion pattern 'wrapper_gen<ArgNest>'
+  //    contains no argument packs
+};
+
+