https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82626
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- __FLT_EVAL_METHOD__ 0 can't be correct in that case, "all operations and constants evaluate in the range and precision of the type used." does not hold, but "all operations and constants evaluate in the range and precision of long double." which is the requirement for 2 doesn't hold either - float operations evaluate in the range and precision of that type (float), double evaluates in the range and precision of long double. float_t/double_t definitions aren't provided by GCC, but by the C library. So, if they aren't defined properly in that case, it is up to glibc or mingw or whatever else projects owns them.