https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93926
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |ASSIGNED
CC| |msebor at gcc dot gnu.org
Assignee|unassigned at gcc dot gnu.org |msebor at gcc dot
gnu.org
--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
The bug here is in the mismatch between the permissive way the front-end
validates declarations of built-ins and the more restrictive validation done by
the middle-end.
The front-end silently accepts as valid redeclarations whose number of
arguments and their modes (as well as the mode of the return type) match the
built-in, even if types are different. So 'long malloc(int)' is treated as a
built-in.
But the middle-end validation looks like this:
if (DECL_IS_MALLOC (decl)
&& !POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
{
error ("malloc attribute should be used for a function that "
"returns a pointer");
error_found = true;
}
DECL_IS_MALLOC(decl) is set but the return type is wrong.
I think incompatible redeclarations should be diagnosed regardless of whether
their type modes match; they could still keep being accepted as built-ins
because it helps find bugs in their use. The middle-end checking would then
need to change to match the front-end. It seems that abstracting the checking
into a common function used by both would help keep the two from getting out of
sync. Let me look into making that happen.