This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix libgomp Fortran tests
On Thu, Sep 07, 2006 at 11:38:26PM -0700, Brooks Moses wrote:
> 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,
Can you open a PR? I did not realize that there was
this hair splitting. Oh, and this isn't going to be
easy to fix.
--
Steve