https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69221
--- Comment #2 from Sergei Trofimovich <slyfox at inbox dot ru> ---
(In reply to Andreas Schwab from comment #1)
> The declaration of f isn't compatible with its defintion. A cast doesn't
> change that fact.
Correct. But is it relevant here? Cast is the only real thing gcc sees.
'void * f();' is an incomplete declaration.
Is there a way to introduce a symbol without any declaration so cast would be
only source of ABI information?
If I change 'int' to 'float' in original sample it will be compiled correctly.
// was return 1 + ((int (*)(void))f)();
return 1 + (int)((float (*)(void))f)();
GCC won't try to cast from %a0 but will pick %fp0:
g:
jsr f
fintrz.x %fp0,%fp0
fmove.l %fp0,%d0
addq.l #1,%d0
rts
I suspect gcc actually knows it can use 'int' / 'void*' interchangeaby. But on
m68k it's not true.