On Fri, Jan 26, 2024 at 11:38:01PM +0100, FX Coudert wrote: > > Interesting example. > > > > % gfcx -o z a.f90 && ./z > > -128 > > % gfcx -o z -pedantic a.f90 && ./z > > a.f90:5:20: > > > > 5 | data j /-128_int8/ > > | 1 > > Error: Integer too big for its kind at (1). This check can be disabled with > > the option ‘-fno-range-check’ > > That qualifies as a compiler bug, I think. Our documentation for -pedantic > states: “Issue warnings for uses of extensions to Fortran.” and "Valid > Fortran programs should compile properly with or without this option.” > > The same is true of the following, which is also valid Fortran since 95 : > > use iso_fortran_env > implicit none > complex, parameter :: z = (-128_int8, -128_int8) > print *, z > end > > Right now it fails to compile with -pedantic. > > Or are they illegal because of how the range should be be symmetric? I can’t > quite find the language in the standard for that, actually. To me, they’re > valid signed-int-literal-constant. >
Symmetry comes from the definition of a model integer number in 16.3.3 "Bit sequences as arguments to INT and REAL". If 'i' and 'j' are INTEGER(1), then this leads to something like 'j = abs(i)' being comforming except if 'i = -128'. As far as literal constants, one has from Fortran 2023 p. 66 R707 signed-int-literal-constant is [ sign ] int-literal-constant R708 int-literal-constant is digit-string [ _ kind-param ] R709 kind-param is digit-string R710 signed-digit-string is [ sign ] digit-string R711 digit-string is digit [ digit ] ... R712 sign is + or - I cannot find in the Standard any statement about the conversion of a digit-string to an internal representation. I suspect it depends on the path through the compiler. In assignments, the signed-digit-string is likely handled as a unary operator and operand. -- Steve