Missing warning
Steve Kargl
sgk@troutmask.apl.washington.edu
Thu Feb 28 16:06:00 GMT 2019
Consider
% cat a.f90
integer i
real x
i = 10**23
x = 6.02 * 10**23
print *, i, x
end
% gfcx -o z a.f90 -Wall -fdump-parse-tree && ./z
a.f90:4:18:
4 | x = 6.02 * 10**23
| 1
Warning: Change of value in conversion from 'INTEGER(4)' to
'REAL(4)' at (1) [-Wconversion]
...
code:
ASSIGN MAIN__:i 100000000000000000000000
ASSIGN MAIN__:x 6.01999981e23
WRITE UNIT=6 FMT=-1
TRANSFER MAIN__:i
TRANSFER MAIN__:x
DT_END
------------------------------------------
-159383552 6.01999981E+23
It seems that the exponential operator is not range checking
its result during constant folding. The RHS side for the
assignment of 'i' is too large for the decimal range for
a signed 32-bit integer. The RHS of the assignment of 'x'
accidentally gets the intended number.
F2018, 10.1.5.2.4 Evaluation of numeric intrinsic operations
The execution of any numeric operation whose result is not defined
by the arithmetic used by the processor is prohibited.
One might argument that the result for 'i' is valid Fortran
as 2s-complement wrap semantics may be "the arithmetic used
by the processor". If that is the case, then the result for
'x' is wrong. OTOH, the infinite precision result for 10**23
shown in the dump as 10000000000000000000000 is outside of the
range of a signed 32-bit integer. I suspect that gfortran should
be issuing a warning here.
--
Steve
More information about the Fortran
mailing list