public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/100875] New: Spurious behavior for non-advancing user defined derived type IO
@ 2021-06-02 10:13 ehlert at thch dot uni-bonn.de
0 siblings, 0 replies; only message in thread
From: ehlert at thch dot uni-bonn.de @ 2021-06-02 10:13 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100875
Bug ID: 100875
Summary: Spurious behavior for non-advancing user defined
derived type IO
Product: gcc
Version: 10.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: ehlert at thch dot uni-bonn.de
Target Milestone: ---
Created attachment 50907
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50907&action=edit
Minimal reproducer
First reported in https://github.com/fortran-lang/stdlib/issues/354
This is an instance of user defined derived type IO using non-advancing read to
retrieve a whole line into a deferred length character component of a derived
type.
The implementation boils more or less down to the following subroutine
(complete reproducer attached):
!> Read a character sequence from a connected formatted unit into the
string.
subroutine read_formatted(string, unit, iotype, v_list, iostat, iomsg)
type(string_type), intent(inout) :: string
integer, intent(in) :: unit
character(len=*), intent(in) :: iotype
integer, intent(in) :: v_list(:)
integer, intent(out) :: iostat
character(len=*), intent(inout) :: iomsg
character(len=:), allocatable :: line
call read_line(unit, line, iostat, iomsg)
string%raw = line
contains
!> Internal routine to read a whole record from a formatted unit
subroutine read_line(unit, line, iostat, iomsg)
integer, intent(in) :: unit
character(len=:), allocatable, intent(out) :: line
integer, intent(out) :: iostat
character(len=*), intent(inout) :: iomsg
integer, parameter :: buffer_size = 512
character(len=buffer_size) :: buffer
integer :: chunk
line = ''
do
read(unit, '(a)', iostat=iostat, iomsg=iomsg, size=chunk,
advance='no') &
buffer
if (iostat > 0) exit
line = line // buffer(:chunk)
if (iostat < 0) exit
end do
if (is_iostat_eor(iostat)) then
iostat = 0
end if
end subroutine read_line
end subroutine read_formatted
Reading from a file with three lines
(1) Some value
(2) Important saved value
(3) Another line
will skip the second line when using the above routine through the
write(formatted) interface.
Compiling and running the minimal reproducer yields:
❯ gfortran -v -save-temps -Wall -Wextra -fno-strict-aliasing -fwrapv mwe.f90
Driving: gfortran -v -save-temps -Wall -Wextra -fno-strict-aliasing -fwrapv
mwe.f90 -l gfortran -l m -shared-libgcc
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib
--libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://bugs.archlinux.org/
--enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --with-isl
--with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit
--enable-cet=auto --enable-checking=release --enable-clocale=gnu
--enable-default-pie --enable-default-ssp --enable-gnu-indirect-function
--enable-gnu-unique-object --enable-install-libiberty --enable-linker-build-id
--enable-lto --enable-multilib --enable-plugin --enable-shared
--enable-threads=posix --disable-libssp --disable-libstdcxx-pch
--disable-libunwind-exceptions --disable-werror
gdc_include_dir=/usr/include/dlang/gdc
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.2.0 (GCC)
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-Wextra' '-fno-strict-aliasing'
'-fwrapv' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/f951 mwe.f90 -quiet -dumpbase mwe.f90
-mtune=generic -march=x86-64 -auxbase mwe -Wall -Wextra -version
-fno-strict-aliasing -fwrapv -fintrinsic-modules-path
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/finclude
-fpre-include=/usr/include/finclude/math-vector-fortran.h -o mwe.s
GNU Fortran (GCC) version 10.2.0 (x86_64-pc-linux-gnu)
compiled by GNU C version 10.2.0, GMP version 6.2.1, MPFR version
4.1.0, MPC version 1.2.1, isl version isl-0.21-GMP
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU Fortran2008 (GCC) version 10.2.0 (x86_64-pc-linux-gnu)
compiled by GNU C version 10.2.0, GMP version 6.2.1, MPFR version
4.1.0, MPC version 1.2.1, isl version isl-0.21-GMP
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
mwe.f90:217:29:
217 | character(len=512) :: flc
| 1
Warning: Unused variable ‘flc’ declared at (1) [-Wunused-variable]
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-Wextra' '-fno-strict-aliasing'
'-fwrapv' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
as -v --64 -o mwe.o mwe.s
GNU assembler version 2.36.1 (x86_64-pc-linux-gnu) using BFD version (GNU
Binutils) 2.36.1
Reading specs from
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/libgfortran.spec
rename spec lib to liborig
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-Wextra' '-fno-strict-aliasing'
'-fwrapv' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-Wextra' '-fno-strict-aliasing'
'-fwrapv' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/collect2 -plugin
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/liblto_plugin.so
-plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper
-plugin-opt=-fresolution=mwe.res -plugin-opt=-pass-through=-lgcc_s
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lquadmath
-plugin-opt=-pass-through=-lm -plugin-opt=-pass-through=-lgcc_s
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc
-plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id
--eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker
/lib64/ld-linux-x86-64.so.2 -pie
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/Scrt1.o
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtbeginS.o
-L/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0
-L/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib -L/lib/../lib
-L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../.. mwe.o
-lgfortran -lm -lgcc_s -lgcc -lquadmath -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtendS.o
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/crtn.o
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-Wextra' '-fno-strict-aliasing'
'-fwrapv' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
❯ ./a.out
string: "(3) Another line "
stat: 0
is_iostat_eor(stat): F
is_iostat_end(stat): F
Which is both the wrong line and the wrong length of the raw value.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-06-02 10:13 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-02 10:13 [Bug fortran/100875] New: Spurious behavior for non-advancing user defined derived type IO ehlert at thch dot uni-bonn.de
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).