]> git.puffer.fish Git - mirror/frr.git/commitdiff
tools/gcc-frr-format: fix ICE in gcc-10 7443/head
authorDavid Lamparter <equinox@diac24.net>
Mon, 2 Nov 2020 23:53:29 +0000 (00:53 +0100)
committerDavid Lamparter <equinox@diac24.net>
Mon, 2 Nov 2020 23:53:29 +0000 (00:53 +0100)
gcc-10 has a more strict internal assert for type checks so the plugin
currently causes an Internal Compiler Error.  Fix.

Signed-off-by: David Lamparter <equinox@diac24.net>
tools/gcc-plugins/frr-format.c

index be56517171280ef32a4e5560855c905f56c6b744..6d91d2cdcd034c2d3f1e87028d17ba8a565368bf 100644 (file)
@@ -2729,6 +2729,16 @@ tree type_normalize (tree type, tree *cousin, tree target = NULL)
   return type;
 }
 
+/* gcc-10 asserts when you give a TYPE_DECL instead of the actual TYPE */
+static tree
+decl_deref(tree typ)
+{
+  while (TREE_CODE (typ) == TYPE_DECL)
+    typ = DECL_ORIGINAL_TYPE (typ);
+
+  return typ;
+}
+
 static void
 check_format_types (const substring_loc &fmt_loc,
                    format_wanted_type *types, const format_kind_info *fki,
@@ -2750,6 +2760,8 @@ check_format_types (const substring_loc &fmt_loc,
       wanted_type = types->wanted_type;
       arg_num = types->arg_num;
 
+      wanted_type = decl_deref(wanted_type);
+
       /* The following should not occur here.  */
       gcc_assert (wanted_type);
       gcc_assert (wanted_type != void_type_node || types->pointer_count);
@@ -2873,7 +2885,7 @@ check_format_types (const substring_loc &fmt_loc,
                          || cur_type == signed_char_type_node
                          || cur_type == unsigned_char_type_node);
 
-      int compat = lang_hooks.types_compatible_p (wanted_type, cur_type);
+      int compat = lang_hooks.types_compatible_p (decl_deref (wanted_type), decl_deref (cur_type));
       /* Check the type of the "real" argument, if there's a type we want.  */
       if ((TREE_CODE (wanted_type) != INTEGER_TYPE || types->pointer_count)
          && compat)
@@ -3180,6 +3192,9 @@ matching_type_p (tree spec_type, tree arg_type)
   gcc_assert (spec_type);
   gcc_assert (arg_type);
 
+  spec_type = decl_deref (spec_type);
+  arg_type = decl_deref (arg_type);
+
   /* If any of the types requires structural equality, we can't compare
      their canonical types.  */
   if (TYPE_STRUCTURAL_EQUALITY_P (spec_type)