Fix mangling ICE [PR94027]
authorNathan Sidwell <nathan@acm.org>
Fri, 6 Mar 2020 18:51:26 +0000 (10:51 -0800)
committerNathan Sidwell <nathan@acm.org>
Fri, 6 Mar 2020 18:51:26 +0000 (10:51 -0800)
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
gcc/cp/mangle.c
gcc/testsuite/g++.dg/pr94027.C [new file with mode: 0644]

index f01563e96fce6833e22d9fde35d319e679cde6cd..98640a671cc570a1b70751df7f8e64a55ca86eb5 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        PR c++/90938
index a0e888fde62f2c2112a249927553443689e877ca..1fc78bfa7536478fdc3479186de9b79c1ade0df4 100644 (file)
@@ -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 <char, std::char_traits<char> > .  */
       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 (file)
index 0000000..03cd68f
--- /dev/null
@@ -0,0 +1,22 @@
+// { 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 ({});
+}