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) ^~~~~~~~~~~~~~