diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2009-06-07 19:00:47 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2009-06-07 19:00:47 +0000 |
commit | dcfddbd49c64dc1e8b57e3abe1b941bdd74b8f70 (patch) | |
tree | a644300144767eca9a438e4638477cda691850c5 /libgfortran/io/open.c | |
parent | 9ad55c33ae2d0c410fbc563fd59e8edb37a48b8b (diff) | |
download | gcc-dcfddbd49c64dc1e8b57e3abe1b941bdd74b8f70.zip gcc-dcfddbd49c64dc1e8b57e3abe1b941bdd74b8f70.tar.gz gcc-dcfddbd49c64dc1e8b57e3abe1b941bdd74b8f70.tar.bz2 |
re PR fortran/40008 (F2008: Add NEWUNIT= for OPEN statement)
2009-06-07 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/40008
* libgfortran.h: Define IOPARM_OPEN_HAS_NEWUNIT.
* io/open.c (st_open): Don't error on negative unit number if NEWUNIT
was specified. If NEWUNIT is specified, call new function to get the
unique unit number and assign it.
* io/io.h (st_parameter_open): Add pointer to newunit. Add prototype for
next_available_newunit. Add prototype for new function,
get_unique_unit_number.
* io/unit.c: Declare next_available_newunit. Define the first newunit
number. (init_units): Initialize next_available_unit.
(get_unique_unit_number): New function. Fix whitespace and comments.
* io/transfer.c (data_transfer_init): Update error message to not be
specific to OPEN statements.
From-SVN: r148253
Diffstat (limited to 'libgfortran/io/open.c')
-rw-r--r-- | libgfortran/io/open.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c index ba6e9d8..d5b4007 100644 --- a/libgfortran/io/open.c +++ b/libgfortran/io/open.c @@ -814,7 +814,7 @@ st_open (st_parameter_open *opp) flags.convert = conv; - if (opp->common.unit < 0) + if (!(opp->common.flags & IOPARM_OPEN_HAS_NEWUNIT) && opp->common.unit < 0) generate_error (&opp->common, LIBERROR_BAD_OPTION, "Bad unit number in OPEN statement"); @@ -842,8 +842,13 @@ st_open (st_parameter_open *opp) if ((opp->common.flags & IOPARM_LIBRETURN_MASK) == IOPARM_LIBRETURN_OK) { - u = find_or_create_unit (opp->common.unit); + if ((opp->common.flags & IOPARM_OPEN_HAS_NEWUNIT)) + { + *opp->newunit = get_unique_unit_number(opp); + opp->common.unit = *opp->newunit; + } + u = find_or_create_unit (opp->common.unit); if (u->s == NULL) { u = new_unit (opp, u, &flags); |