In tsubst_pack_expansion, when we don't have fully instantiated arguments we try to do a partial instantiation of the pattern if all the arguments we have are of similar form, for instance if all of them are pack expansions. In one case with concepts we were failing to do that and falling back on the PACK_EXPANSION_EXTRA_ARGS mechanism unnecessarily because we didn't recognize a function parameter pack as itself a pack expansion, which it properly is because its type is a pack expansion. This should be an efficiency improvement on the trunk, as well.

Tested x86_64-pc-linux-gnu, applying to trunk.
commit 659af9891dc5046e584e7e0901fd857dc70dddda
Author: Jason Merrill <ja...@redhat.com>
Date:   Fri Jul 3 13:49:03 2015 -0400

    	* pt.c (argument_pack_element_is_expansion_p): A decl pack is an
    	expansion.

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index e819b69..0302de1 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -9838,6 +9838,9 @@ argument_pack_element_is_expansion_p (tree arg_pack, int i)
   if (i >= TREE_VEC_LENGTH (vec))
     return 0;
   tree elt = TREE_VEC_ELT (vec, i);
+  if (DECL_P (elt))
+    /* A decl pack is itself an expansion.  */
+    elt = TREE_TYPE (elt);
   if (!PACK_EXPANSION_P (elt))
     return 0;
   if (PACK_EXPANSION_EXTRA_ARGS (elt))

Reply via email to