Commit 191bcd0f by Nathan Sidwell

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.
parent 0b839322
2020-03-06 Nathan Sidwell <nathan@acm.org>
PR c++/94027
* mangle.c (find_substitution): Don't call same_type_p on template
args that cannot match.
2020-03-04 Martin Sebor <msebor@redhat.com> 2020-03-04 Martin Sebor <msebor@redhat.com>
PR c++/90938 PR c++/90938
......
...@@ -628,6 +628,8 @@ find_substitution (tree node) ...@@ -628,6 +628,8 @@ find_substitution (tree node)
{ {
tree args = CLASSTYPE_TI_ARGS (type); tree args = CLASSTYPE_TI_ARGS (type);
if (TREE_VEC_LENGTH (args) == 3 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) && same_type_p (TREE_VEC_ELT (args, 0), char_type_node)
&& is_std_substitution_char (TREE_VEC_ELT (args, 1), && is_std_substitution_char (TREE_VEC_ELT (args, 1),
SUBID_CHAR_TRAITS) SUBID_CHAR_TRAITS)
...@@ -652,7 +654,7 @@ find_substitution (tree node) ...@@ -652,7 +654,7 @@ find_substitution (tree node)
args <char, std::char_traits<char> > . */ args <char, std::char_traits<char> > . */
tree args = CLASSTYPE_TI_ARGS (type); tree args = CLASSTYPE_TI_ARGS (type);
if (TREE_VEC_LENGTH (args) == 2 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) && same_type_p (TREE_VEC_ELT (args, 0), char_type_node)
&& is_std_substitution_char (TREE_VEC_ELT (args, 1), && is_std_substitution_char (TREE_VEC_ELT (args, 1),
SUBID_CHAR_TRAITS)) SUBID_CHAR_TRAITS))
......
// { dg-do compile { target c++11 } }
// PR 94027 ICE mangling
class a {
public:
a (char);
};
struct b {
b (a);
};
template <typename... aw, int...>
void ax (int)
{
struct c : b {
c () : b {sizeof...(aw)}
{}
};
}
void az() {
ax ({});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment