https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91199
Bug ID: 91199 Summary: In -fexcess-precision=standard mode, the warning “floating constant truncated to zero” is misleading Product: gcc Version: 9.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: pascal_cuoq at hotmail dot com Target Milestone: --- Consider the following program: #include <stdio.h> #include <float.h> #define MY_HUGE_VALF 0x1.0p255f float f; int main(void) { f = 0x1.0p-255f * MY_HUGE_VALF; printf("%d, %f\n", (int)FLT_EVAL_METHOD, f); } When compiled with -O -fexcess-precision=standard -mfpmath=387 and executed, this program prints “2, 1.000000”, which indicates that neither factor is 0 and neither is +inf. Compiler Explorer link: https://gcc.godbolt.org/z/RA_tDw This all corresponds exactly to the C standard [1] and Joseph Myers's post [2] introducing the option -fexcess-precision=standard, but please look at the warnings emitted during compilation: <source>:9:3: warning: floating constant truncated to zero [-Woverflow] <source>:9:3: warning: floating constant exceeds range of 'float' [-Woverflow] The second warning, about MY_HUGE_VALF, is not wrong, and probably corresponds to an aspect of the program that should be brought to the attention of the developer. The first warning is wrong: it implies that 0x1.0p-255f will be interpreted as 0 by the compiler, while it (correctly) isn't. I would suggest to make the first warning more like the second one, along the lines of “floating constant underflows range of 'float'”. [1] https://port70.net/~nsz/c/c11/n1570.html#5.2.4.2.2p9 [2] https://gcc.gnu.org/ml/gcc-patches/2008-11/msg00105.html