>> print *, -128_int8
>
> This is a unary minus operator with an operand of 128.
> gfortran does not have negative integers.
To be clear, it’s not gfortran, it’s the standard(s). It’s not exactly true
either, because there is a "signed-int-literal-constant” which is allowed in
some contexts:
- as real part or imaginary part of a complex literal constant
- as a data-stmt-constant
- in some edit descriptors (DT and P control-edit-desc)
This is, for example, legal code (and handled by gfortran as expected):
use iso_fortran_env
implicit none
integer(int8) :: j
data j /-128_int8/
print *, j
end
On the other hand, in your code, -128_int8 cannot be a literal constant,
because integer literal constants cannot have a sign in Fortran. As Steve said,
“-128_int8” in this context in Fortran is the minus unary operator applied to
the integer literal constant 128_int8.
We current output this:
4 | j = -128_int8
| 1
Error: Integer too big for its kind at (1). This check can be disabled with the
option '-fno-range-check’
I think the only better output we could give is to make it clear what the
integer value is, either by underlining it (but we don’t have a framework to do
that right now) or by outputting the value in the message (?).
Best,
FX