[PR94044] Fix ICE with sizeof<argumentpack>
authorNathan Sidwell <nathan@acm.org>
Mon, 23 Mar 2020 10:39:49 +0000 (03:39 -0700)
committerNathan Sidwell <nathan@acm.org>
Mon, 23 Mar 2020 10:39:49 +0000 (03:39 -0700)
Thanks to Jim for figuring out how to reproduce the problem, I was
able to apply pr94044-jig.diff to poorly hash the specialization
table. (That places all the specializations of a particular template
in the same bucket, forcing us to compare the arguments.)

The testcase creates sizeof_exprs containing argument packs, and we
can no longer use same_type_p on those.

PR c++/94044
* tree.c (cp_tree_equal) [SIZEOF_EXPR]: Detect argument pack
operand.

gcc/cp/ChangeLog
gcc/cp/tree.c

index 0038704dad06bd41d6648809788d2942e9f53f9e..3340f47d506406fa09b4eb8228aa5ef3c035adb0 100644 (file)
@@ -1,3 +1,9 @@
+2020-03-23  nathans  <nathan@acm.org>
+
+       PR c++/94044
+       * tree.c (cp_tree_equal) [SIZEOF_EXPR]: Detect argument pack
+       operand.
+
 2020-03-21  Patrick Palka  <ppalka@redhat.com>
 
        PR c++/94066
index da2e7fdcca3031f052b0415f80f77352f47c1bea..b85967e1bfab63e0ddc187d7f5778653ff68173f 100644 (file)
@@ -3802,9 +3802,13 @@ cp_tree_equal (tree t1, tree t2)
            if (SIZEOF_EXPR_TYPE_P (t2))
              o2 = TREE_TYPE (o2);
          }
+
        if (TREE_CODE (o1) != TREE_CODE (o2))
          return false;
-       if (TYPE_P (o1))
+
+       if (ARGUMENT_PACK_P (o1))
+         return template_args_equal (o1, o2);
+       else if (TYPE_P (o1))
          return same_type_p (o1, o2);
        else
          return cp_tree_equal (o1, o2);