[Bug c++/79008] missing detail in -Wbuiltin-declaration-mismatch

msebor at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Aug 24 21:54:00 GMT 2017


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79008

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|WAITING                     |UNCONFIRMED
     Ever confirmed|1                           |0

--- Comment #2 from Martin Sebor <msebor at gcc dot gnu.org> ---
I think what I had in mind was incompatible attribute specifications rather
than missing ones but my description sounds a little confused. 
-Wbuiltin-declaration-mismatch also doesn't diagnose incompatible attributes
(maybe it should).

One example of an incompatibility is the following declaration:

  int __attribute__ ((pure)) abs (int);

where abs() the built-in is actually declared const.  GCC doesn't currently
diagnose this except with my patch for bug 81544 (yet to be reviewed).

Another, slightly different, example is declaring a standard library function
with the wrong attributes, like this one:

void* __attribute__ ((malloc, alloc_size (1))) realloc (void*, size_t);

This is wrong on two counts: first, realloc cannot be declared with attribute
malloc because it need not return a unique pointer.  Second, alloc_size
specifies the wrong argument (this is bug 78667).

Since many built-in functions are decorated with multiple attributes it seems
that rather than pointing out these kinds of issues one attribute at a time
(either when there are more than one or as the user adjusts their declaration)
it would be simpler and more user-friendly to include in the diagnostic all the
attributes the built-in is decorated with.  Hence the suggestion to introduce a
a new flag (and perhaps also a conversion specifier) to the pretty printer to
have it (optionally) print the whole attribute list, or parts of it.

E.g.,

  warning ("%#qD conflicts with built-in declaration %#qD", user_decl,
builtin_in_decl);

might print

  warning: ‘int abs(int) __attribute__ ((pure))’ conflicts with built-in
declaration ‘int abs(int) __attribute__ ((const))’


More information about the Gcc-bugs mailing list