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

            Bug ID: 93762
           Summary: Truncation of deferred-length string when passing as
                    optional
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: chaudhry.ross at gmail dot com
  Target Milestone: ---

Created attachment 47848
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47848&action=edit
Minimal reproducing code

(This issue was first reported on SO here:
https://stackoverflow.com/questions/60229805/truncation-of-deferred-length-string-when-passing-as-optional)

When passing strings declared as deferred-length and optional through several
subroutines, they are truncated. A minimal example is attached, which yields
the following (expected) result on Intel 16.0, Intel 2019_U4, or PGI 15.10:

$ ifort main.f90 && ./a.out 
 at bot of deepest_call, str is "12345"
 at bot of interface_call, str is "12345"
 at bot of main, str is "12345"

However, with gfortran 4.8.5:

$ gfortran --version
GNU Fortran (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
Copyright (C) 2015 Free Software Foundation, Inc.

GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING

$ gfortran main.f90 && ./a.out 
 at bot of deepest_call, str is "12345"
 at bot of interface_call, str is ""
 at bot of main, str is ""

On the newer version of gfortran I have available (7.2 and 8.2.0), this simple
example segfaults when compiled with no options, but truncates the output when
compiled using checks:

$ gfortran --version
GNU Fortran (GCC) 8.2.0
Copyright (C) 2018 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 -g -fbacktrace -Wall -Wextra -std=f2008 -fcheck=all -Og main.f90 &&
./a.out
 at bot of deepest_call, str is "12345"
 at bot of interface_call, str is ""
 at bot of main, str is ""

It seems to me that this is a compiler error spanning a range of GCC versions
(at least 4.8.5 to 8.2.0). So my first purpose for reporting it here is so
people are aware of it.

According to francescalus on the StackOverflow post, the error does not occur
on the very latest 10.0.0. However, I think it would be good to add this
minimal example (or something similar) to the gfortran test suite to prevent
the error from occurring again.

Reply via email to