On Wed, 2017-09-20 at 10:17 -0600, Martin Sebor wrote: > > The comment copied below from sysdeps/aarch64/multiarch/memmove.c > suggests this might be deliberate: > > /* Redefine memmove so that the compiler won't complain about the > type > mismatch with the IFUNC selector in strong_alias, below. */ > > so my guess is that the improved type checking has just exposed > this mismatch. Can you please post the translation unit so we > can confirm it? > > Thanks > Martin
The translation unit is sysdeps/aarch64/multiarch/memmove.c. If I preprocess that and cut out the unneeded parts I get: extern int i; typedef long unsigned int size_t; extern void *__redirect_memmove (void *__dest, const void *__src, size_t __n) __attribute__ ((__nothrow__ )) ; extern __typeof (__redirect_memmove) __libc_memmove; extern __typeof (__redirect_memmove) __memmove_generic ; extern __typeof (__redirect_memmove) __memmove_thunderx ; extern __typeof (__libc_memmove) __libc_memmove; __typeof (__libc_memmove) *__libc_memmove_ifunc (void) __asm__ ("__libc_memmove"); __attribute__ ((__optimize__ ("-fno-stack-protector"))) __typeof (__libc_memmove) *__libc_memmove_ifunc (void) { __typeof (__libc_memmove) *res = i ? __memmove_thunderx : __memmove_generic; return res; } __asm__ (".type " "__libc_memmove" ", %gnu_indirect_function"); extern __typeof (__libc_memmove) memmove __attribute__ ((alias ("__libc_memmove")));; Which, when compiled gives me: % install/bin/gcc -c x.c x.c:15:34: warning: ‘memmove’ alias between functions of incompatible types ‘void *(void *, const void *, size_t) {aka void *(void *, const void *, long unsigned int)}’ and ‘void * (*(void))(void *, const void *, size_t) {aka void * (*(void))(void *, const void *, long unsigned int)}’ [-Wattributes] extern __typeof (__libc_memmove) memmove __attribute__ ((alias ("__libc_memmove")));; ^~~~~~~ x.c:10:84: note: aliased declaration here (__optimize__ ("-fno-stack-protector"))) __typeof (__libc_memmove) *__libc_memmove_ifunc (void) ^~ ~~~~~~~~~~~~~~~~~~