aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTilo Schwarz <tilo@tilo-schwarz.de>2013-03-20 07:45:49 +0000
committerTobias Burnus <burnus@gcc.gnu.org>2013-03-20 08:45:49 +0100
commit09c7dc636d0f407c4184b33e97928c3e2545130b (patch)
tree0744b6d570842d8431a17b50679a66226389d6f5
parenta192015dbab317517c463c5ed1ce03f3df22cbbe (diff)
downloadgcc-09c7dc636d0f407c4184b33e97928c3e2545130b.zip
gcc-09c7dc636d0f407c4184b33e97928c3e2545130b.tar.gz
gcc-09c7dc636d0f407c4184b33e97928c3e2545130b.tar.bz2
re PR libfortran/48618 (Negative unit number in OPEN(...) is sometimes allowed)
2013-03-20 Tilo Schwarz <tilo@tilo-schwarz.de> PR libfortran/48618 * io/open.c (st_open): Raise error for unit number < 0 only if unit number does not exist already. 2013-03-20 Tilo Schwarz <tilo@tilo-schwarz.de> PR libfortran/48618 * gfortran.dg/open_negative_unit_1.f90: New. From-SVN: r196805
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/open_negative_unit_1.f9021
-rw-r--r--libgfortran/ChangeLog6
-rw-r--r--libgfortran/io/open.c14
4 files changed, 41 insertions, 5 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6769ff7..7fe42de 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-03-20 Tilo Schwarz <tilo@tilo-schwarz.de>
+
+ PR libfortran/48618
+ * gfortran.dg/open_negative_unit_1.f90: New.
+
2013-03-19 Ian Bolton <ian.bolton@arm.com>
* gcc.target/aarch64/sbc.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/open_negative_unit_1.f90 b/gcc/testsuite/gfortran.dg/open_negative_unit_1.f90
new file mode 100644
index 0000000..6446436
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/open_negative_unit_1.f90
@@ -0,0 +1,21 @@
+! { dg-do run }
+! PR48618 - Negative unit number in OPEN(...) is sometimes allowed
+!
+! Test originally from Janne Blomqvist in PR:
+! http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48618
+
+program nutest
+ implicit none
+ integer id, ios
+
+ open(newunit=id, file="foo.txt", iostat=ios)
+ if (ios /= 0) call abort
+
+ open(id, file="bar.txt", iostat=ios)
+ if (ios /= 0) call abort
+
+ close(id, status="delete")
+
+ open(-10, file="foo.txt", iostat=ios)
+ if (ios == 0) call abort
+end program nutest
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 2a28f84..31d5b57 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2013-03-20 Tilo Schwarz <tilo@tilo-schwarz.de>
+
+ PR libfortran/48618
+ * io/open.c (st_open): Raise error for unit number < 0 only if
+ unit number does not exist already.
+
2013-03-19 Janne Blomqvist <jb@gcc.gnu.org>
* libgfortran.h: Include stdbool.h.
diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c
index d9cfde8..19fab1d 100644
--- a/libgfortran/io/open.c
+++ b/libgfortran/io/open.c
@@ -818,10 +818,6 @@ st_open (st_parameter_open *opp)
flags.convert = conv;
- 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");
-
if (flags.position != POSITION_UNSPECIFIED
&& flags.access == ACCESS_DIRECT)
generate_error (&opp->common, LIBERROR_BAD_OPTION,
@@ -848,8 +844,16 @@ st_open (st_parameter_open *opp)
{
if ((opp->common.flags & IOPARM_OPEN_HAS_NEWUNIT))
opp->common.unit = get_unique_unit_number(opp);
+ else if (opp->common.unit < 0)
+ {
+ u = find_unit (opp->common.unit);
+ if (u == NULL) /* Negative unit and no NEWUNIT-created unit found. */
+ generate_error (&opp->common, LIBERROR_BAD_OPTION,
+ "Bad unit number in OPEN statement");
+ }
- u = find_or_create_unit (opp->common.unit);
+ if (u == NULL)
+ u = find_or_create_unit (opp->common.unit);
if (u->s == NULL)
{
u = new_unit (opp, u, &flags);