https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66311

Francois-Xavier Coudert <fxcoudert at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |fxcoudert at gcc dot gnu.org,
                   |                            |jakub at redhat dot com

--- Comment #6 from Francois-Xavier Coudert <fxcoudert at gcc dot gnu.org> ---
Definitely a middle-end issue. We get it right on the front-end, the variable
initialization gets screwed when translated later. Reduced testcase:

$ cat a.f90
program test
  integer(kind=16) :: z = 18446744073709551614_16
  print *, z
end
$ ./usr/local/bin/gfortran -fdump-parse-tree -fdump-tree-original a.f90 &&
./a.out
 -2


The "parse tree" clearly shows that z has value of 18446744073709551614_16. But
in the a.f90.003t.original, we get the wrong initialization:

  static integer(kind=16) z = -2;


I tracked the issue to the two calls to wi::from_mpz() and wide_int_to_tree()
in gcc/fortran/trans-const.c:gfc_conv_mpz_to_tree(). There the mpz value (which
is correct) in translated into:

  wide_int_storage = {
    val = ([0] = -2, [1] = 0, [2] = 56)
    len = 1
    precision = 128
  }

which appears to be where the -2 comes from. Probably not seen outside Fortran
because people don't use this conversion routine in C (because there is not way
to input literal __int128 values in C).

Can someone familiar with wide-int look into it?

Reply via email to