diff mbox

C++ PATCH for c++/67164 (error with variadic templates)

Message ID CADzB+2=Qf5_KCxouQFxE4V+Ufmrb8xe2EYQ8SByyWD5Tt8KeGg@mail.gmail.com
State New
Headers show

Commit Message

Jason Merrill July 20, 2016, 5:04 a.m. UTC
On Thu, Mar 3, 2016 at 8:41 PM, Jason Merrill <jason@redhat.com> wrote:
> When we instantiate an element of a pack expansion, we replace the argument
> pack in the template argument vec with an ARGUMENT_PACK_SELECT which
> indicates the desired element of the vec.  If the args have been used to
> instantiate other templates as well, the args of those instances get
> modified as well, which can lead to strange results when we run into
> ARGUMENT_PACK_SELECT in inappropriate places.  This patch fixes this issue
> by making a copy of the template args before we start messing with them.

...so we don't need to deal with ARGUMENT_PACK_SELECT in the hash
tables anymore.
commit b5cb8944e6feb6f4c53170c5d58bc50e4fa5503a
Author: Jason Merrill <jason@redhat.com>
Date:   Tue Jul 19 12:49:53 2016 -0400

    	PR c++/67164 - clean up dead code
    
    	* pt.c (iterative_hash_template_arg, template_args_equal): Don't
    	handle ARGUMENT_PACK_SELECT.
diff mbox

Patch

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 916fd7b..7c7024c 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -1704,9 +1704,7 @@  iterative_hash_template_arg (tree arg, hashval_t val)
     STRIP_NOPS (arg);
 
   if (TREE_CODE (arg) == ARGUMENT_PACK_SELECT)
-    /* We can get one of these when re-hashing a previous entry in the middle
-       of substituting into a pack expansion.  Just look through it.  */
-    arg = ARGUMENT_PACK_SELECT_FROM_PACK (arg);
+    gcc_unreachable ();
 
   code = TREE_CODE (arg);
   tclass = TREE_CODE_CLASS (code);
@@ -7894,17 +7892,7 @@  template_args_equal (tree ot, tree nt)
       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);
-    }
+    gcc_unreachable ();
   else if (TYPE_P (nt))
     {
       if (!TYPE_P (ot))