Fix PR c++/41785
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 26 Oct 2009 18:31:22 +0000 (18:31 +0000)
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 26 Oct 2009 18:31:22 +0000 (18:31 +0000)
gcc/cp/ChangeLog:

PR c++/41785
* pt.c (template_args_equal): Handle comparison of
an ARGUMENT_PACK_SELECT node with the arguments node it selects into.
* cp-tree.def: Fix a typo in the description of TYPE_PACK_EXPANSION.

gcc/testsuite/ChangeLog:
PR c++/41785
* gcc/testsuite/g++.dg/cpp0x/variadic96.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153564 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 467f078..2f7ec52 100644 (file)
@@ -1,5 +1,12 @@
 2009-10-26  Dodji Seketeli  <dodji@redhat.com>
 
+       PR c++/41785
+       * pt.c (template_args_equal): Handle comparison of
+       an ARGUMENT_PACK_SELECT node with the arguments node it selects into.
+       * cp-tree.def: Fix a typo in the description of TYPE_PACK_EXPANSION.
+
+2009-10-26  Dodji Seketeli  <dodji@redhat.com>
+
        PR c++/41020
        * decl.c (decls_match): Use DECL_IS_BUILTIN instead of
        DECL_BUILT_IN.
index 4df01a8..28ecc5b 100644 (file)
@@ -393,7 +393,7 @@ DEFTREECODE (NONTYPE_ARGUMENT_PACK, "nontype_argument_pack", tcc_expression, 1)
      };
 
    The derivation from tuple contains a TYPE_PACK_EXPANSION for the
-   template arguments. Its EXPR_PACK_EXPANSION is "Values&" and its
+   template arguments. Its PACK_EXPANSION_PATTERN is "Values&" and its
    PACK_EXPANSION_PARAMETER_PACKS will contain "Values".  */
 DEFTREECODE (TYPE_PACK_EXPANSION, "type_pack_expansion", tcc_type, 0)
 
index 084ad1c..e80bc30 100644 (file)
@@ -5818,6 +5818,18 @@ template_args_equal (tree ot, tree nt)
          return 0;
       return 1;
     }
+  else if (ot && TREE_CODE (ot) == ARGUMENT_PACK_SELECT)
+    {
+      /* We get here probably because we are in the middle of substituting
+         into the pattern of a pack expansion. In that case the
+        ARGUMENT_PACK_SELECT temporarily replaces the pack argument we are
+        interested in. So we want to use the initial pack argument for
+        the comparison.  */
+      ot = ARGUMENT_PACK_SELECT_FROM_PACK (ot);
+      if (nt && TREE_CODE (nt) == ARGUMENT_PACK_SELECT)
+       nt = ARGUMENT_PACK_SELECT_FROM_PACK (nt);
+      return template_args_equal (ot, nt);
+    }
   else if (TYPE_P (nt))
     return TYPE_P (ot) && same_type_p (ot, nt);
   else if (TREE_CODE (ot) == TREE_VEC || TYPE_P (ot))
index 08a7de5..cc89a76 100644 (file)
@@ -1,3 +1,8 @@
+2009-10-26  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/41785
+       * gcc/testsuite/g++.dg/cpp0x/variadic96.C: New test.
+
 2009-10-26  Nick Clifton  <nickc@redhat.com>
 
        * lib/target-supports.exp (check_profiling_available):
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic96.C b/gcc/testsuite/g++.dg/cpp0x/variadic96.C
new file mode 100644 (file)
index 0000000..d4709d0
--- /dev/null
@@ -0,0 +1,26 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/41785
+// { dg-options -std=c++0x }
+
+struct a {};
+
+template < typename T, typename ENCLOSING >
+struct base;
+
+template < typename... T >
+struct derived
+  : public base< T, derived< T... > >...
+{};
+
+template < typename... T>
+struct base< a, derived< T... > >
+{
+  typedef derived< T... >
+          Derived;
+};
+
+int main()
+{
+  derived< a > instance;
+}
+