From 26b3e568a60e9fd851efb436531752a5e49e6419 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Mon, 23 Mar 2020 03:39:49 -0700 Subject: [PATCH] [PR94044] Fix ICE with sizeof 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 | 6 ++++++ gcc/cp/tree.c | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0038704dad0..3340f47d506 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2020-03-23 nathans + + PR c++/94044 + * tree.c (cp_tree_equal) [SIZEOF_EXPR]: Detect argument pack + operand. + 2020-03-21 Patrick Palka PR c++/94066 diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index da2e7fdcca3..b85967e1bfa 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); -- 2.30.2