Lets look at the definition of the macros again:
#define fpclassify(x) \
(__extension__ ({__typeof__(x) __x = (x); \
(sizeof (__x) == sizeof (float)) ?
__fpclassifyf(__x) : __fpclassifyd(__x);}))
#define isfinite(x) \
(__extension__ ({__typeof__(x) __x = (x); \
fpclassify(__x) != FP_INFINITE &&
fpclassify(__x) != FP_NAN;}))
See how we pass __x to fpclassify, well when we preprocessed the
source we get in there:
__typeof__(x) __x = (__x); which just makes this uninitialized. The
reason why we
don't warn about it in gcc is because int a = a; is documented to have
the uninitilizated
warnings to go away.
Thanks,
Andrew Pinski
a gcc developer and a gcc bug master