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,
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);
|| 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)
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)