------- Comment #9 from kargl at gcc dot gnu dot org 2008-06-13 05:31 -------
(In reply to comment #8)
> So people don't understand that in Fortran types are symmetric? Hasn't they
> been symmetric for 20 years now? How can this be for latency programs
> really?
> Maybe gfortran is just the first compiler which enforces this :).
It's more complicated than the above. The standard does not require
symmetry in the range of integers. One can maintain (and I'll use
integer*1) that -128 is the minimum integer*1 value given the "model
number" representation for integer*1. Unfortunately, the parser always
sees -128 as a unary minus and an operand of 128. The 128 overflows the
range of [-128:127].
Here's where programmers run into problems:
program a
integer*1 i
i = -128 ! Unary minus and overflow of 128
i = - huge(i) - 1 ! (Almost) guaranteed to be legal given base 2.
i = iabs(i) ! THIS IS ILLEGAL Fortran.
end program a
To allow the "i = -128" line of code, gfortran has introduced
the -fno-range-check option, and it lets the middle and back
end deal with possibly out of range values (ie, -129).
Note, you can force gfortran to use a symmetric range for the
integers with the -pedantic options. From fortran/arith.c
/* See PRs 13490 and 17912, related to integer ranges.
The pedantic_min_int exists for range checking when a program
is compiled with -pedantic, and reflects the belief that
Standard Fortran requires integers to be symmetrical, i.e.
every negative integer must have a representable positive
absolute value, and vice versa. */
mpz_init (int_info->pedantic_min_int);
mpz_neg (int_info->pedantic_min_int, int_info->huge);
I was involved in the discussion long ago, and I now think I may have
been wrong and the pedantic_min_int stuff should be removed.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36515