Hello All,
The attached patch fixes numerous return values or missing checks.
There were at least two places where we segfaulted on checking a gfc_unit value
when the unit did not exist.
I have not implemented inquire (unit=lun, leading_zero=leading_zero) since this
is rather new and I prefer to add it after this patch. It is one of those
examples of a new feature added that does not have a lot of value AFAICT. It
will require some front-end work.
The new test case is very busy. It is not too difficult to adjust if we miss
anything there.
Regression tested on X86_64.
OK for mainline?
Regards,
Jerry
-----
fortran: Fix several issues with INQUIRE and unconnected units.
PR libfortran/124543
libgfortran/ChangeLog:
* io/inquire.c (inquire_via_unit): Fix return value for
NAMED. Add check for ACTION. Fix return values for
ENCODING, PENDING, READ, WRITE, READWRITE.
(inquire_via_filename): Add checks for ACTION, DELIM,
ASYNCHRONOUS, and PENDING. Fix return value for
ENCODING.
* io/unix.c (inquire_access): Change return value from no
to unknown.
gcc/testsuite/ChangeLog:
* gfortran.dg/pr124543.f90: New test.
commit 21ef8e2c2110728a32a2da16be63abe817e00606
Author: Jerry DeLisle <[email protected]>
Date: Sat Mar 28 15:59:42 2026 -0700
fortran: Fix several issues with INQUIRE and unconnected units.
PR libfortran/124543
libgfortran/ChangeLog:
* io/inquire.c (inquire_via_unit): Fix return value for
NAMED. Add check for ACTION. Fix return values for
ENCODING, PENDING, READ, WRITE, READWRITE.
(inquire_via_filename): Add checks for ACTION, DELIM,
ASYNCHRONOUS, and PENDING. Fix return value for
ENCODING.
* io/unix.c (inquire_access): Change return value from no
to unknown.
gcc/testsuite/ChangeLog:
* gfortran.dg/pr124543.f90: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr124543.f90 b/gcc/testsuite/gfortran.dg/pr124543.f90
new file mode 100644
index 00000000000..8dc168de47c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr124543.f90
@@ -0,0 +1,391 @@
+! { dg-do run )
+
+! PR124543, test case derived from that in the PR with several
+! corrections
+program inq_tests
+ implicit none
+
+! Test various INQUIRE return values
+! Most of these tests are based on Table C.1 in Section C.6.5 of F95.
+! F2003, F2018 and F2023 can optionally be enabled.
+
+ character(16) :: access, action, blank, delim, direct, form, formatted
+ character(16) :: name, pad, position, read, readwrite, sequential
+ character(16) :: unformatted, write
+
+ logical :: exist, named, opened
+ integer :: iostat, nextrec, number, recl
+
+ character(20) :: decimal, encoding, round, signc, stream
+ integer :: pos
+ character(16) :: async
+ integer :: id
+ logical :: pending
+ character(16) :: leading_zero
+
+ integer, parameter :: lun = 42
+ character(*), parameter :: lfn = 'fort.42'
+
+ integer :: fail_count = 0, pass_count = 0
+
+! Make sure there is no file with the name we will be using
+ open (lun, file=lfn, status='old', iostat=iostat)
+ if (iostat /= 0) then
+ close (lun, status='delete')
+ end if
+
+! File not connected yet
+ call init_vars ()
+ inquire (file=lfn, access=access, action=action, blank=blank, delim=delim, exist=exist, &
+ direct=direct, form=form, formatted=formatted, pad=pad, position=position, &
+ read=read, readwrite=readwrite, sequential=sequential, unformatted=unformatted, &
+ write=write, named=named, name=name, number=number, opened=opened, iostat=iostat)
+ !print *, 'Unconnected INQUIRE by file'
+ if (iostat /= 0) stop 49
+ if (access /= 'UNDEFINED') stop 50
+ if (action /= 'UNDEFINED') stop 51
+ if (blank /= 'UNDEFINED') stop 52
+ if (delim /= 'UNDEFINED') stop 53
+ if (direct /= 'UNKNOWN') stop 54
+ if (exist) stop 55
+ if (form /= 'UNDEFINED') stop 56
+ if (formatted /= 'UNKNOWN') stop 57
+ if (name /= lfn) stop 58
+ if (.not. named) stop 59
+ if (number /= -1) stop 60
+ if (opened) stop 61
+ if (pad /= 'UNDEFINED') stop 62
+ if (position /= 'UNDEFINED') stop 63
+ if (read /= 'UNKNOWN') stop 64 ! The file does not exist.
+ if (readwrite /= 'UNKNOWN') stop 65
+ if (sequential /= 'UNKNOWN') stop 66
+ if (unformatted /= 'UNKNOWN') stop 67
+ if (write /= 'UNKNOWN') stop 68
+
+ inquire (file=lfn, decimal=decimal, encoding=encoding, pos=pos, &
+ round=round, sign=signc, stream=stream)
+ if (decimal /= 'UNDEFINED') stop 72
+ if (encoding /= 'UNKNOWN') stop 73
+ if (round /= 'UNDEFINED') stop 74
+ if (signc /= 'UNDEFINED') stop 75
+ if (stream /= 'UNKNOWN') stop 76
+ inquire (file=lfn, asynchronous=async)
+ if (async /= 'UNDEFINED') stop 78
+ inquire (file=lfn, id=id, pending=pending, recl=recl) ! SEGV at run-time w/gfortran
+ if (pending) print *, pending
+ if (recl /= -1) stop 81
+! inquire (file=lfn, leading_zero=leading_zero) stop
+! print *, 'leading_zero =', leading_zero, pf (leading_zero /= 'UNDEFINED')
+
+! Unit not connected yet
+ call init_vars ()
+ inquire (unit=lun, access=access, action=action, blank=blank, delim=delim, &
+ direct=direct, form=form, formatted=formatted, pad=pad, position=position, &
+ read=read, readwrite=readwrite, sequential=sequential, unformatted=unformatted, &
+ write=write, named=named, name=name, number=number, opened=opened, iostat=iostat)
+ !print *
+ !print *, 'Unconnected INQUIRE by unit'
+ if (iostat /= 0) stop 93
+ if (access /= 'UNDEFINED') stop 94
+ if (action /= 'UNDEFINED') stop 95
+ if (blank /= 'UNDEFINED') stop 96
+ if (delim /= 'UNDEFINED') stop 97
+ if (direct /= 'UNKNOWN') stop 98
+ if (exist) stop 99
+ if (form /= 'UNDEFINED') stop 100
+ if (formatted /= 'UNKNOWN') stop 101
+ if (name /= 'xxx') stop 102
+ if (named) stop 103
+ if (number /= -1) stop 104
+ if (opened) stop 105
+ if (pad /= 'UNDEFINED') stop 106
+ if (position /= 'UNDEFINED') stop 107
+ if (read /= 'UNKNOWN') stop 108
+ if (readwrite /= 'UNKNOWN') stop 109
+ if (sequential /= 'UNKNOWN') stop 110
+ if (unformatted /= 'UNKNOWN') stop 111
+ if (write /= 'UNKNOWN') stop 112
+
+ inquire (unit=lun, decimal=decimal, encoding=encoding, pos=pos, &
+ round=round, sign=signc, stream=stream)
+ if (decimal /= 'UNDEFINED') stop 116
+ if (encoding /= 'UNKNOWN') stop 117
+ if (round /= 'UNDEFINED') stop 118
+ if (signc /= 'UNDEFINED') stop 119
+ if (stream /= 'UNKNOWN') stop 120
+ inquire (unit=lun, asynchronous=async)
+ if (async /= 'UNDEFINED') stop 122
+ inquire (unit=lun, id=id, pending=pending, recl=recl) ! SEGV at run-time w/gfortran
+ if (pending) stop 124
+ if (recl /= -1) stop 125
+! inquire (unit=lun, leading_zero=leading_zero)
+! print *, 'leading_zero =', leading_zero, pf (leading_zero /= 'UNDEFINED')
+
+! Open the file to connect it to the unit - sequential access
+
+ open (lun, file=lfn, status='new', access='sequential', form='formatted', recl=80)
+ write (lun,*)'hello world!'
+ rewind (lun)
+
+ call init_vars ()
+ inquire (file=lfn, access=access, action=action, blank=blank, delim=delim, recl=recl, &
+ direct=direct, form=form, formatted=formatted, pad=pad, position=position, exist=exist, &
+ read=read, readwrite=readwrite, sequential=sequential, unformatted=unformatted, &
+ write=write, named=named, name=name, number=number, opened=opened, iostat=iostat)
+ !print *
+ !print *, 'Connected INQUIRE by file (sequential)'
+ if (iostat /= 0) stop 142
+ if (access /= 'SEQUENTIAL') stop 143
+ if (action /= 'READWRITE') stop 144
+ if (blank /= 'NULL') stop 145
+ if (delim /= 'NONE') stop 146
+ if (direct /= 'NO') stop 147
+ if (.not. exist) stop 148
+ if (form /= 'FORMATTED') stop 149
+ if (formatted /= 'YES') stop 150
+ if (name /= lfn) stop 151
+ if (.not. named) stop 152
+ if (number /= 42) stop 153
+ if (.not. opened) stop 154
+ if (pad /= 'YES') stop 155
+ if (position /= 'REWIND') stop 156
+ if (read /= 'YES') stop 157
+ if (readwrite /= 'YES') stop 158
+ if (recl /= 80) stop 159
+ if (sequential /= 'YES') stop 160
+ if (unformatted /= 'NO') stop 161
+ if (write /= 'YES') stop 162
+
+ inquire (file=lfn, decimal=decimal, encoding=encoding, pos=pos, &
+ round=round, sign=signc, stream=stream)
+ if (decimal /= 'POINT') stop 166
+ if (encoding /= 'UNKNOWN') stop 167
+ if (round /= 'PROCESSOR_DEFINED') stop 168
+ if (signc /= 'PROCESSOR_DEFINED') stop 169
+ if (stream /= 'NO') stop 170
+
+! Unit is connected
+ call init_vars ()
+ inquire (unit=lun, access=access, action=action, blank=blank, recl=recl, delim=delim, &
+ direct=direct, form=form, formatted=formatted, pad=pad, position=position, &
+ read=read, readwrite=readwrite, sequential=sequential, unformatted=unformatted, &
+ write=write, named=named, name=name, number=number, opened=opened, iostat=iostat)
+ !print *
+ !print *, 'Connected INQUIRE by unit (sequential)'
+ if (iostat /= 0) stop 180
+ if (access /= 'SEQUENTIAL') stop 181
+ if (action /= 'READWRITE') stop 182
+ if (blank /= 'NULL') stop 183
+ if (delim /= 'NONE') stop 184
+ if (direct /= 'NO') stop 185
+ if (.not. exist) stop 186
+ if (form /= 'FORMATTED') stop 187
+ if (formatted /= 'YES') stop 188
+ if (name /= lfn) stop 189
+ if (.not. named) stop 190
+ if (number /= 42) stop 191
+ if (.not. opened) stop 192
+ if (pad /= 'YES') stop 193
+ if (position /= 'REWIND') stop 194
+ if (read /= 'YES') stop 195
+ if (readwrite /= 'YES') stop 196
+ if (recl /= 80) stop 197
+ if (sequential /= 'YES') stop 198
+ if (unformatted /= 'NO') stop 199
+ if (write /= 'YES') stop 200
+
+ inquire (unit=lun, decimal=decimal, encoding=encoding, pos=pos, &
+ round=round, sign=signc, stream=stream)
+ if (decimal /= 'POINT') stop 204
+ if (encoding /= 'UNKNOWN') stop 205
+ if (round /= 'PROCESSOR_DEFINED') stop 206
+ if (signc /= 'PROCESSOR_DEFINED') stop 207
+ if (stream /= 'NO') stop 208
+
+ close (lun, status='delete')
+
+! Open the file to connect it to the unit - sequential stream access
+
+ open (lun, file=lfn, status='new', access='stream', form='unformatted')
+ write (lun) 'hello world!'
+ rewind (lun)
+
+ call init_vars ()
+ inquire (file=lfn, access=access, action=action, blank=blank, delim=delim, &
+ direct=direct, form=form, formatted=formatted, pad=pad, position=position, &
+ read=read, readwrite=readwrite, sequential=sequential, unformatted=unformatted, &
+ write=write, opened=opened, name=name, number=number, named=named, iostat=iostat)
+ !print *
+ !print *, 'Connected INQUIRE by file (stream, unformatted)'
+ if (iostat /= 0) stop 225
+ if (access /= 'STREAM') stop 226
+ if (action /= 'READWRITE') stop 227
+ if (blank /= 'UNDEFINED') stop 228
+ if (delim /= 'UNDEFINED') stop 229
+ if (direct /= 'NO') stop 230
+ if (.not. exist) stop 231
+ if (form /= 'UNFORMATTED') stop 232
+ if (formatted /= 'NO') stop 233
+ if (name /= lfn) stop 234
+ if (.not. named) stop 235
+ if (number /= 42) stop 236
+ if (.not. opened) stop 237
+ if (pad /= 'UNDEFINED') stop 238
+ if (position /= 'REWIND') stop 239
+ if (read /= 'YES') stop 240
+ if (readwrite /= 'YES') stop 241
+ if (sequential /= 'NO') stop 242
+ if (unformatted /= 'YES') stop 243
+ if (write /= 'YES') stop 244
+
+ inquire (file=lfn, decimal=decimal, encoding=encoding, pos=pos, &
+ round=round, sign=signc, stream=stream, recl=recl)
+ if (decimal /= 'UNDEFINED') stop 248
+ if (encoding /= 'UNKNOWN') stop 249
+ if (round /= 'PROCESSOR_DEFINED') stop 250
+ if (signc /= 'PROCESSOR_DEFINED') stop 251
+ if (stream /= 'YES') stop 252
+ if (recl /= -2) stop 253
+
+! Unit is connected
+ call init_vars ()
+ inquire (unit=lun, access=access, action=action, blank=blank, delim=delim, opened=opened, &
+ direct=direct, form=form, formatted=formatted, pad=pad, position=position, &
+ read=read, readwrite=readwrite, sequential=sequential, unformatted=unformatted, &
+ write=write, name=name, named=named, number=number, recl=recl, iostat=iostat)
+ !print *
+ !print *, 'Connected INQUIRE by unit (stream, unformatted)'
+ if (iostat /= 0) stop 263
+ if (access /= 'STREAM') stop 264
+ if (action /= 'READWRITE') stop 265
+ if (blank /= 'UNDEFINED') stop 266
+ if (delim /= 'UNDEFINED') stop 267
+ if (direct /= 'NO') stop 268
+ if (.not. exist) stop 269
+ if (form /= 'UNFORMATTED') stop 270
+ if (formatted /= 'NO') stop 271
+ if (name /= lfn) stop 272
+ if (.not. named) stop 273
+ if (number /= 42) stop 274
+ if (.not. opened) stop 275
+ if (pad /= 'UNDEFINED') stop 276
+ if (position /= 'REWIND') stop 277
+ if (read /= 'YES') stop 278
+ if (readwrite /= 'YES') stop 279
+ if (sequential /= 'NO') stop 280
+ if (unformatted /= 'YES') stop 281
+ if (write /= 'YES') stop 282
+
+ inquire (unit=lun, decimal=decimal, encoding=encoding, pos=pos, &
+ round=round, sign=signc, stream=stream)
+ if (decimal /= 'UNDEFINED') stop 286
+ if (encoding /= 'UNKNOWN') stop 287
+ if (round /= 'PROCESSOR_DEFINED') stop 288
+ if (signc /= 'PROCESSOR_DEFINED') stop 289
+ if (stream /= 'YES') stop 290
+ if (recl /= -2) stop 291
+ close (lun, status='delete')
+
+! Open the file to connect it to the unit - direct access
+
+ open (lun, file=lfn, status='new', access='direct', recl=12, form='formatted')
+ write (lun,rec=1, fmt='(a)') 'hello world!'
+
+ call init_vars ()
+ inquire (file=lfn, access=access, action=action, blank=blank, delim=delim, &
+ direct=direct, form=form, formatted=formatted, nextrec=nextrec, pad=pad, opened=opened, &
+ position=position, read=read, readwrite=readwrite, recl=recl, name=name, named=named, &
+ sequential=sequential, unformatted=unformatted, write=write, number=number, iostat=iostat)
+ !print *
+ !print *, 'Connected INQUIRE by file (direct, formatted)'
+ if (iostat /= 0) stop 306
+ if (access /= 'DIRECT') stop 307
+ if (action /= 'READWRITE') stop 308
+ if (blank /= 'NULL') stop 309
+ if (delim /= 'NONE') stop 310
+ if (direct /= 'YES') stop 311
+ if (.not. exist) stop 312
+ if (form /= 'FORMATTED') stop 313
+ if (formatted /= 'YES') stop 314
+ if (name /= lfn) stop 315
+ if (.not. named) stop 316
+ if (nextrec /= 2) stop 317
+ if (number /= 42) stop 318
+ if (.not. opened) stop 319
+ if (pad /= 'YES') stop 320
+ if (position /= 'UNDEFINED') stop 31
+ if (read /= 'YES') stop 322
+ if (readwrite /= 'YES') stop 323
+ if (recl /= 12) stop 324
+ if (sequential /= 'NO') stop 325
+ if (unformatted /= 'NO') stop 326
+ if (write /= 'YES') stop 327
+
+! Unit is connected
+ call init_vars ()
+ inquire (unit=lun, access=access, action=action, blank=blank, delim=delim, &
+ direct=direct, form=form, formatted=formatted, nextrec=nextrec, pad=pad, opened=opened, &
+ position=position, read=read, readwrite=readwrite, recl=recl, name=name, named=named, &
+ sequential=sequential, unformatted=unformatted, write=write, number=number, iostat=iostat)
+ !print *
+ !print *, 'Connected INQUIRE by unit (direct, formatted)'
+ if (iostat /= 0) stop 337
+ if (access /= 'DIRECT') stop 338
+ if (action /= 'READWRITE') stop 339
+ if (blank /= 'NULL') stop 340
+ if (delim /= 'NONE') stop 341
+ if (direct /= 'YES') stop 342
+ if (.not. exist) stop 343
+ if (form /= 'FORMATTED') stop 344
+ if (formatted /= 'YES') stop 345
+ if (name /= lfn) stop 346
+ if (.not. named) stop 347
+ if (nextrec /= 2) stop 348
+ if (number /= 42) stop 349
+ if (.not. opened) stop 350
+ if (pad /= 'YES') stop 351
+ if (position /= 'UNDEFINED') stop 352
+ if (read /= 'YES') stop 353
+ if (readwrite /= 'YES') stop 354
+ if (recl /= 12) stop 355
+ if (sequential /= 'NO') stop 356
+ if (unformatted /= 'NO') stop 357
+ if (write /= 'YES') stop 358
+
+ close (lun, status="delete")
+ print *, "all pass"
+contains
+
+ subroutine init_vars ()
+
+ access = 'xxx'
+ action = 'xxx'
+ blank = 'xxx'
+ delim = 'xxx'
+ direct = 'xxx'
+ form = 'xxx'
+ formatted = 'xxx'
+ name = 'xxx'
+ nextrec = -41
+ number = -42
+ pad = 'xxx'
+ position = 'xxx'
+ read = 'xxx'
+ readwrite = 'xxx'
+ recl = -43
+ sequential = 'xxx'
+ unformatted = 'xxx'
+ write = 'xxx'
+ decimal = 'xxx'
+ encoding = 'xxx'
+ round = 'xxx'
+ pos = -44
+ signc = 'xxx'
+ stream = 'xxx'
+ async = 'xxx'
+ id = -45
+ leading_zero = 'xxx'
+
+ end subroutine
+
+end program
diff --git a/libgfortran/io/inquire.c b/libgfortran/io/inquire.c
index 5c1bb78bd0d..f96210f1d57 100644
--- a/libgfortran/io/inquire.c
+++ b/libgfortran/io/inquire.c
@@ -60,7 +60,11 @@ inquire_via_unit (st_parameter_inquire *iqp, gfc_unit *u)
*iqp->number = (u != NULL) ? u->unit_number : -1;
if ((cf & IOPARM_INQUIRE_HAS_NAMED) != 0)
- *iqp->named = (u != NULL && u->flags.status != STATUS_SCRATCH);
+ {
+ *iqp->named = 0;
+ if (u != NULL && u->flags.status != STATUS_SCRATCH)
+ *iqp->named = 1;
+ }
if ((cf & IOPARM_INQUIRE_HAS_NAME) != 0
&& u != NULL && u->flags.status != STATUS_SCRATCH)
@@ -119,6 +123,29 @@ inquire_via_unit (st_parameter_inquire *iqp, gfc_unit *u)
cf_strcpy (iqp->access, iqp->access_len, p);
}
+ if ((cf & IOPARM_INQUIRE_HAS_ACTION) != 0)
+ {
+ if (u == NULL)
+ p = undefined;
+ else
+ switch (u->flags.action)
+ {
+ case ACTION_READ:
+ p = "READ";
+ break;
+ case ACTION_WRITE:
+ p = "WRITE";
+ break;
+ case ACTION_READWRITE:
+ p = "READWRITE";
+ break;
+ default:
+ internal_error (&iqp->common, "inquire_via_filename(): Bad action");
+ }
+
+ cf_strcpy (iqp->action, iqp->action_len, p);
+ }
+
if ((cf & IOPARM_INQUIRE_HAS_SEQUENTIAL) != 0)
{
if (u == NULL)
@@ -285,7 +312,7 @@ inquire_via_unit (st_parameter_inquire *iqp, gfc_unit *u)
if ((cf2 & IOPARM_INQUIRE_HAS_ENCODING) != 0)
{
if (u == NULL || u->flags.form != FORM_FORMATTED)
- p = undefined;
+ p = "UNKNOWN";
else
switch (u->flags.encoding)
{
@@ -345,7 +372,9 @@ inquire_via_unit (st_parameter_inquire *iqp, gfc_unit *u)
if ((cf2 & IOPARM_INQUIRE_HAS_PENDING) != 0)
{
- if (!ASYNC_IO || u->au == NULL)
+ if (u == NULL)
+ *iqp->pending = 0;
+ else if (!ASYNC_IO || u->au == NULL)
*(iqp->pending) = 0;
else
{
@@ -353,12 +382,12 @@ inquire_via_unit (st_parameter_inquire *iqp, gfc_unit *u)
if ((cf2 & IOPARM_INQUIRE_HAS_ID) != 0)
{
int id;
- id = *(iqp->id);
- *(iqp->pending) = id > u->au->id.low;
+ id = *iqp->id;
+ *iqp->pending = id >= u->au->id.low;
}
else
{
- *(iqp->pending) = ! u->au->empty;
+ *iqp->pending = !u->au->empty;
}
UNLOCK (&(u->au->lock));
}
@@ -567,19 +596,28 @@ inquire_via_unit (st_parameter_inquire *iqp, gfc_unit *u)
if ((cf & IOPARM_INQUIRE_HAS_READ) != 0)
{
- p = (!u || u->flags.action == ACTION_WRITE) ? no : yes;
+ if (u == NULL)
+ p = "UNKNOWN";
+ else
+ p = (!u || u->flags.action == ACTION_WRITE) ? no : yes;
cf_strcpy (iqp->read, iqp->read_len, p);
}
if ((cf & IOPARM_INQUIRE_HAS_WRITE) != 0)
{
- p = (!u || u->flags.action == ACTION_READ) ? no : yes;
+ if (u == NULL)
+ p = "UNKNOWN";
+ else
+ p = (!u || u->flags.action == ACTION_READ) ? no : yes;
cf_strcpy (iqp->write, iqp->write_len, p);
}
if ((cf & IOPARM_INQUIRE_HAS_READWRITE) != 0)
{
- p = (!u || u->flags.action != ACTION_READWRITE) ? no : yes;
+ if (u == NULL)
+ p = "UNKNOWN";
+ else
+ p = (!u || u->flags.action != ACTION_READWRITE) ? no : yes;
cf_strcpy (iqp->readwrite, iqp->readwrite_len, p);
}
@@ -678,6 +716,12 @@ inquire_via_filename (st_parameter_inquire *iqp)
const char *p;
GFC_INTEGER_4 cf = iqp->common.flags;
+ if ((cf & IOPARM_INQUIRE_HAS_ACTION) != 0)
+ cf_strcpy (iqp->action, iqp->action_len, undefined);
+
+ if ((cf & IOPARM_INQUIRE_HAS_DELIM) != 0)
+ cf_strcpy (iqp->delim, iqp->delim_len, undefined);
+
if ((cf & IOPARM_INQUIRE_HAS_EXIST) != 0)
*iqp->exist = file_exists (iqp->file, iqp->file_len);
@@ -722,7 +766,6 @@ inquire_via_filename (st_parameter_inquire *iqp)
p = "UNKNOWN";
cf_strcpy (iqp->unformatted, iqp->unformatted_len, p);
}
-
if ((cf & IOPARM_INQUIRE_HAS_RECL_OUT) != 0)
/* F2018 (N2137) 12.10.2.26: If there is no connection, recl is
assigned the value -1. */
@@ -741,8 +784,20 @@ inquire_via_filename (st_parameter_inquire *iqp)
{
GFC_INTEGER_4 cf2 = iqp->flags2;
+ if ((cf2 & IOPARM_INQUIRE_HAS_ASYNCHRONOUS) != 0)
+ cf_strcpy (iqp->asynchronous, iqp->asynchronous_len, undefined);
+
+ if ((cf2 & IOPARM_INQUIRE_HAS_PENDING) != 0)
+ *iqp->pending = 0;
+
if ((cf2 & IOPARM_INQUIRE_HAS_ENCODING) != 0)
- cf_strcpy (iqp->encoding, iqp->encoding_len, undefined);
+ cf_strcpy (iqp->encoding, iqp->encoding_len, "UNKNOWN");
+
+ if ((cf2 & IOPARM_INQUIRE_HAS_SIGN) != 0)
+ cf_strcpy (iqp->sign, iqp->sign_len, undefined);
+
+ if ((cf2 & IOPARM_INQUIRE_HAS_ROUND) != 0)
+ cf_strcpy (iqp->round, iqp->round_len, undefined);
if ((cf2 & IOPARM_INQUIRE_HAS_DELIM) != 0)
cf_strcpy (iqp->delim, iqp->delim_len, undefined);
@@ -756,9 +811,6 @@ inquire_via_filename (st_parameter_inquire *iqp)
if ((cf2 & IOPARM_INQUIRE_HAS_PAD) != 0)
cf_strcpy (iqp->pad, iqp->pad_len, undefined);
- if ((cf2 & IOPARM_INQUIRE_HAS_ENCODING) != 0)
- cf_strcpy (iqp->encoding, iqp->encoding_len, undefined);
-
if ((cf2 & IOPARM_INQUIRE_HAS_SIZE) != 0)
*iqp->size = file_size (iqp->file, iqp->file_len);
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index 2e8c790e475..2a115dc35a5 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -2046,7 +2046,7 @@ inquire_access (const char *string, gfc_charlen_type len, int mode)
int res = access (path, mode);
free (path);
if (res == -1)
- return no;
+ return unknown;
return yes;
}