diff options
author | Nathan Sidwell <nathan@acm.org> | 2020-03-23 03:39:49 -0700 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2020-03-23 03:39:49 -0700 |
commit | 26b3e568a60e9fd851efb436531752a5e49e6419 (patch) | |
tree | f358753890093dc116d3fca84127d00863278378 | |
parent | 7a2090b04e54ffccc64ad2dfd5b46eb4bb8ce482 (diff) | |
download | gcc-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.
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/tree.c | 6 |
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); |