From 191bcd0f30dd37dec773efb0125afdcae9bd90ef Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 6 Mar 2020 10:51:26 -0800 Subject: [PATCH] Fix mangling ICE [PR94027] PR c++/94027 * mangle.c (find_substitution): Don't call same_type_p on template args that cannot match. Now same_type_p rejects argument packs, we need to be more careful calling it with template argument vector contents. The mangler needs to do some comparisons to find the special substitutions. While that code looks a little ugly, this seems the smallest fix. --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/mangle.c | 4 +++- gcc/testsuite/g++.dg/pr94027.C | 22 ++++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/pr94027.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f01563e96fc..98640a671cc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2020-03-06 Nathan Sidwell + + PR c++/94027 + * mangle.c (find_substitution): Don't call same_type_p on template + args that cannot match. + 2020-03-04 Martin Sebor PR c++/90938 diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index a0e888fde62..1fc78bfa753 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -628,6 +628,8 @@ find_substitution (tree node) { tree args = CLASSTYPE_TI_ARGS (type); if (TREE_VEC_LENGTH (args) == 3 + && (TREE_CODE (TREE_VEC_ELT (args, 0)) + == TREE_CODE (char_type_node)) && same_type_p (TREE_VEC_ELT (args, 0), char_type_node) && is_std_substitution_char (TREE_VEC_ELT (args, 1), SUBID_CHAR_TRAITS) @@ -652,7 +654,7 @@ find_substitution (tree node) args > . */ tree args = CLASSTYPE_TI_ARGS (type); if (TREE_VEC_LENGTH (args) == 2 - && TYPE_P (TREE_VEC_ELT (args, 0)) + && TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_CODE (char_type_node) && same_type_p (TREE_VEC_ELT (args, 0), char_type_node) && is_std_substitution_char (TREE_VEC_ELT (args, 1), SUBID_CHAR_TRAITS)) diff --git a/gcc/testsuite/g++.dg/pr94027.C b/gcc/testsuite/g++.dg/pr94027.C new file mode 100644 index 00000000000..03cd68f1b0f --- /dev/null +++ b/gcc/testsuite/g++.dg/pr94027.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } +// PR 94027 ICE mangling + +class a { +public: + a (char); +}; +struct b { + b (a); +}; +template +void ax (int) +{ + struct c : b { + c () : b {sizeof...(aw)} + {} + }; +} + +void az() { + ax ({}); +} -- 2.30.2