This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/81882] New: attribute ifunc documentation uses invalid code
- From: "msebor at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 17 Aug 2017 17:33:39 +0000
- Subject: [Bug c/81882] New: attribute ifunc documentation uses invalid code
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81882
Bug ID: 81882
Summary: attribute ifunc documentation uses invalid code
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
The documentation of the ifunc ("resolver") attribute in the GCC manual isn't
quite correct. It advises users to declare the resolver to return a pointer to
a void function returning void, and shows an example of how to do that, like
so:
typedef __SIZE_TYPE__ size_t;
void* my_memcpy (void *dst, const void *src, size_t len)
{
// ...
return dst;
}
static void (*resolve_memcpy (void)) (void)
{
return my_memcpy; // we'll just always select this routine
}
But the example returns the address of a function of incompatible type, which
then causes compilation warnings in C and errors in C++ (see below).
Instead, the resolver should be declared to return a pointer to the a function
of the same type as whose address it returns.
x.c: In function ‘resolve_memcpy’:
x.c:10:10: warning: returning ‘void * (*)(void *, const void *, size_t) {aka
void * (*)(void *, const void *, long unsigned int)}’ from a function with
incompatible return type ‘void (*)(void)’ [-Wincompatible-pointer-types]
return my_memcpy; // we'll just always select this routine
^~~~~~~~~
At top level:
x.c:8:15: warning: ‘resolve_memcpy’ defined but not used [-Wunused-function]
static void (*resolve_memcpy (void)) (void)
^~~~~~~~~~~~~~