https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118935
Jerry DeLisle <jvdelisle at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jvdelisle at gcc dot gnu.org
--- Comment #7 from Jerry DeLisle <jvdelisle at gcc dot gnu.org> ---
(In reply to chenglulu from comment #1)
> Upon debugging, it was discovered that if the '-O0' option is used to
> compile the `find_file0` function in `libgfortran/io/unix.c`, random errors
> occur. However, if the `find_file0` function is compiled with the '-O1'
> option, no random errors arise.
>
> The erroneous code is as follows:
> libgfortran/io/unix.c
> ```
> static gfc_unit *
> find_file0 (gfc_unit *u, FIND_FILE0_DECL)
> {
> ......
> #ifdef HAVE_WORKING_STAT
> if (u->s != NULL) // The input I provided next was: At this point,
> when making the judgment, u->s is not NULL.
> {
> unix_stream *s = (unix_stream *) (u->s);
> if (st[0].st_dev == s->st_dev && st[0].st_ino == s->st_ino) // But
> here it is NULL,u->s has been modified.
> return u;
> }
> ```
>
I do not understand what you mean has been modified. If the unit structure
passed in via the *u has had it's stream u->s assigned it means there is a file
associated with this unit already and therefore a new unit structure need not
be created for the file.
There were some recent changes made in the use of locks that I was not involved
with. I wonder if the problem you are seeing is a side effect of those changes.
I did just now go look at rw_lock_1.f90. This is what I think.
More importantly I dont believe it is legitimate to run fortran IO in a libgomp
environment at all. It was and is not designed to run omp_parallel. The
fortran language itself provides it's own parralelism and that is what async
I/O and Coarrays is all about. The OMP directives are outside the scope of the
fortran language, especially regarding file I/O
My opinion is the test case should be removed as invalid.