aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-03-23 03:39:49 -0700
committerNathan Sidwell <nathan@acm.org>2020-03-23 03:39:49 -0700
commit26b3e568a60e9fd851efb436531752a5e49e6419 (patch)
treef358753890093dc116d3fca84127d00863278378 /gcc
parent7a2090b04e54ffccc64ad2dfd5b46eb4bb8ce482 (diff)
downloadgcc-26b3e568a60e9fd851efb436531752a5e49e6419.zip
gcc-26b3e568a60e9fd851efb436531752a5e49e6419.tar.gz
gcc-26b3e568a60e9fd851efb436531752a5e49e6419.tar.bz2
[PR94044] Fix ICE with sizeof<argumentpack>
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/tree.c6
2 files changed, 11 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0038704..3340f47 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index da2e7fd..b85967e 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -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);