Hello,

I've come across an internal compiler error (in GFortran), concerning the
function NINT(), I attach a very simple source code that illustrates the
error.  Essentially I am working with 16-byte integers, and there seems no
way to ensure that NINT() returns the correct precision integer. [I am also
testing this on an Ubuntu-64 installation, see separate email.]

I tried a number of things, to no avail:


   1.   m=nint(y) ! this gives at best an 8 byte integer return and or
   larger numbers is negative,
   2.   m=nint(y,i16) ! this is the attached version, which generates
   compiler error
   3.   m=nint(y,kind=i16) ! also generates error
   4.   integer(kind=16) :: nint; ... m=nint(y) ! does not change return
   type
   5.   trying to compile with "-fdefault-integer-16" # option does not
   exist

Interestingly, in the related function, IDNINT() the "KIND" optional
argument does not even seem to be implemented

Please include all of the following items, the first three of which can be
obtained from the output of gcc -v:

   - the exact version of GCC;
   - the system type; *(Cygwin 64 on top of Windows 10)*
   - the options given when GCC was configured/built;

   -> *cygcheck -c cygwin*
   Cygwin Package Information
   Package              Version        Status
   cygwin               *3.1.6-1*        OK

   -> gcc -v
   Using built-in specs.
   COLLECT_GCC=gcc
   COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/9.3.0/lto-wrapper.exe
   Target: x86_64-pc-cygwin
   Configured with:
   /cygdrive/i/szsz/tmpp/gcc/gcc-9.3.0-2.x86_64/src/gcc-9.3.0/configure
   --srcdir=/cygdrive/i/szsz/tmpp/gcc/gcc-9.3.0-2.x86_64/src/gcc-9.3.0
   --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc
   --docdir=/usr/share/doc/gcc --htmldir=/usr/share/doc/gcc/html -C
   --build=x86_64-pc-cygwin --host=x86_64-pc-cygwin --target=x86_64-pc-cygwin
   --without-libiconv-prefix --without-libintl-prefix --libexecdir=/usr/lib
   --enable-shared --enable-shared-libgcc --enable-static
   --enable-version-specific-runtime-libs --enable-bootstrap
   --enable-__cxa_atexit --with-dwarf2 --with-tune=generic
   --enable-languages=c,c++,fortran,lto,objc,obj-c++ --enable-graphite
   --enable-threads=posix --enable-libatomic --enable-libgomp
   --enable-libquadmath --enable-libquadmath-support --disable-libssp
   --enable-libada --disable-symvers --with-gnu-ld --with-gnu-as
   --with-cloog-include=/usr/include/cloog-isl --without-libiconv-prefix
   --without-libintl-prefix --with-system-zlib --enable-linker-build-id
   --with-default-libstdcxx-abi=gcc4-compatible
   --enable-libstdcxx-filesystem-ts
   Thread model: posix
   gcc version 9.3.0 (GCC)

   and for Gfortran:

   -> gfortran --version
   GNU Fortran (GCC) *9.3.0*
   Copyright (C) 2019 Free Software Foundation, Inc.
   This is free software; see the source for copying conditions.  There is
   NO
   warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
   PURPOSE.

   -> gfortran -v
   Using built-in specs.
   COLLECT_GCC=gfortran
   COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/9.3.0/lto-wrapper.exe
   Target: x86_64-pc-cygwin
   Configured with:
   /cygdrive/i/szsz/tmpp/gcc/gcc-9.3.0-2.x86_64/src/gcc-9.3.0/configure
   --srcdir=/cygdrive/i/szsz/tmpp/gcc/gcc-9.3.0-2.x86_64/src/gcc-9.3.0
   --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc
   --docdir=/usr/share/doc/gcc --htmldir=/usr/share/doc/gcc/html -C
   --build=x86_64-pc-cygwin --host=x86_64-pc-cygwin --target=x86_64-pc-cygwin
   --without-libiconv-prefix --without-libintl-prefix --libexecdir=/usr/lib
   --enable-shared --enable-shared-libgcc --enable-static
   --enable-version-specific-runtime-libs --enable-bootstrap
   --enable-__cxa_atexit --with-dwarf2 --with-tune=generic
   --enable-languages=c,c++,fortran,lto,objc,obj-c++ --enable-graphite
   --enable-threads=posix --enable-libatomic --enable-libgomp
   --enable-libquadmath --enable-libquadmath-support --disable-libssp
   --enable-libada --disable-symvers --with-gnu-ld --with-gnu-as
   --with-cloog-include=/usr/include/cloog-isl --without-libiconv-prefix
   --without-libintl-prefix --with-system-zlib --enable-linker-build-id
   --with-default-libstdcxx-abi=gcc4-compatible
   --enable-libstdcxx-filesystem-ts
   Thread model: posix
   gcc version 9.3.0 (GCC)


   - the complete command line that triggers the bug; *see below*
   - the compiler output (error messages, warnings, etc.); *see below* and
   - the *preprocessed* file (*.i*) that triggers the bug, generated by
   adding -save-temps to the complete compilation command, or, in the case
   of a bug report for the GNAT front end, a complete set of source files (see
   below).

-> gfortran -save-temps -o nint_error.e *nint_error.f90*
nint_error.f90:17:0:

   17 |      m=nint(y,i16)
      |
internal compiler error: in build_round_expr, at
fortran/trans-intrinsic.c:396
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://gcc.gnu.org/bugs/> for instructions.

(and with IDNINT()):

-> gfortran -save-temps -o nint_error.e nint_error.f90
nint_error.f90:17:7:

   17 |      m=idnint(y,i16)
      |       1
Error: Too many arguments in call to ‘idnint’ at (1)

Thanks for looking into this, Bernd (Eggen)

PS Here a part of the output if omitting the "KIND" optional argument in
NINT():
-> ./nint_error.e | & more

i16= 16
1 1 1.0000000000000000 0
2 2 2.0000000000000000 1
3 4 4.0000000000000000 3
4 8 8.0000000000000000 7
[...]
31 1073741824 1073741824.0000000 1073741823
32 2147483648 2147483648.0000000 2147483647
33 4294967296 4294967296.0000000 *-1*


As you can see, after 2^31-1 = 2147483647 it goes wrong and yields -1

If increasing the integer by 1, it goes wrong thus:

[...]
2147483647 2147483647.0000000 2147483647
2147483648 2147483648.0000000 -2147483648
[...]

Attachment: nint_error.f90
Description: Binary data

Attachment: nint_error.s
Description: Binary data

Reply via email to