https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119502
Jerry DeLisle <jvdelisle at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Last reconfirmed| |2025-04-11
Status|UNCONFIRMED |NEW
--- Comment #3 from Jerry DeLisle <jvdelisle at gcc dot gnu.org> ---
This simple patch avoids the segfault.
diff --git a/libgfortran/io/close.c b/libgfortran/io/close.c
index 81223113dc5..f57b618347c 100644
--- a/libgfortran/io/close.c
+++ b/libgfortran/io/close.c
@@ -84,6 +84,12 @@ st_close (st_parameter_close *clp)
if (u != NULL)
{
+ if (u->s == NULL)
+ {
+ if (u->unit_number < 0)
+ generate_error (&clp->common, LIBERROR_OS,
+ "Unit number is negative with no associated file");
+ }
if (close_share (u) < 0)
generate_error (&clp->common, LIBERROR_OS, "Problem in CLOSE");
if (u->flags.status == STATUS_SCRATCH)
As usual I started to explore a bit.
With this following variation we get our existing behaviour.
program foo
integer :: iun = -1
!open (iun)
write(iun,*) "This is a test."
close (iun)
end
gfc z1.f90
$ ./a.out
At line 4 of file z1.f90
Fortran runtime error: Unit number is negative and unit was not already opened
with OPEN(NEWUNIT=...)
This seems reasonable however when I remove the comment on the open statement
we dutifully create the file "fort.-1". This is also our existing behavior. In
my first attempt to generate an error on the open I run into a futex lock and
it hangs.
We can leave the open as is. However, I am wondering what is the right thing to
do.
I am curious what other compilers do with this.
program foo
integer :: iun = -1
open (iun)
write(iun,*) "This is a test."
close (iun)
end