This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Fix libgomp Fortran tests


Roger Sayle wrote:
On Thu, 7 Sep 2006, Steve Kargl wrote:
The Fortran tried to use the most negative integer value, but
this cause an overflow because gfortran creates this value
via a unary minus operation.

Whilst I agree completely that prohibiting the constant -2147483648 adheres to the letter of the standards, might it not be reasonable to support this as a STD_GNU or a STD_LEGACY extension for compatability with other compilers (such as previous versions of gfortran and g77) that are more forgiving in the constants that they accept.

I'm curious how many other F90/F95 compilers (dis)allow -2147483648?

I've been poking at this trying to figure out exactly what the rules are, and I will note that I think there's an interesting hair to split here.


By R305, a constant can be a literal-constant, which can by R306 be an int-literal-constant (but not a signed-int-literal-constant), and thus using -2147493648 in an assignment implies that it is to be interpreted as the positive value with a unary operator applied, and that positive value is out of range.

However, in a DATA statement, the values are not "constants", they are "data-stmt-constants", defined in rule R540, and these use signed literal constants (including signed-int-literal-constant) rather than unsigned ones. As expressions are not allowed as DATA statement values, the interpretation of a negative integer remains unambiguous.

Thus, while

INTEGER J = -2147493648

is not permitted,

  INTEGER J
  DATA J / -2147493648 /

is permitted. (Note that 4.3.1.1, line 25, explicitly states that "Any integer value may be represented as a signed-int-literal-constant.")

- Brooks


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]