summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>2005-11-17 12:46:57 +0000
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>2005-11-17 12:46:57 +0000
commita20e9b770551b8f4943256934689c6c8bfecd35f (patch)
treeb4222529fc4abf9ab78757cfd41d5b3ec666c05d
parent148ad152f2f6dad3160819dc6f471080d801d313 (diff)
downloadgcc-a20e9b770551b8f4943256934689c6c8bfecd35f.tar.gz
PR fortran/24892
* io/io.h (unit_access): Add ACCESS_APPEND. * io/open.c (access_opt): Add APPEND value for ACCESS keyword. (st_open): Use that new value to set the POSITION accordingly. * gfortran.dg/open_access_append_1.f90: New test. * gfortran.dg/open_access_append_2.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@107119 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/open_access_append_1.f9020
-rw-r--r--gcc/testsuite/gfortran.dg/open_access_append_2.f905
-rw-r--r--libgfortran/ChangeLog7
-rw-r--r--libgfortran/io/io.h2
-rw-r--r--libgfortran/io/open.c14
6 files changed, 53 insertions, 1 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dbc0b69f2db..db4aa5a0798 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2005-11-17 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR fortran/24892
+ * gfortran.dg/open_access_append_1.f90: New test.
+ * gfortran.dg/open_access_append_2.f90: New test.
+
2005-11-16 Richard Guenther <rguenther@suse.de>
PR middle-end/24851
diff --git a/gcc/testsuite/gfortran.dg/open_access_append_1.f90 b/gcc/testsuite/gfortran.dg/open_access_append_1.f90
new file mode 100644
index 00000000000..7aa7991a75a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/open_access_append_1.f90
@@ -0,0 +1,20 @@
+! { dg-do run }
+! Testcase for the GNU extension OPEN(...,ACCESS="APPEND")
+ open (10,file="foo")
+ close (10,status="delete")
+
+ open (10,file="foo",access="append") ! { dg-output ".*Extension.*" }
+ write (10,*) 42
+ close (10,status="keep")
+ open (10,file="foo",access="append") ! { dg-output ".*Extension.*" }
+ write (10,*) -42
+ close (10,status="keep")
+
+ open (10,file="foo")
+ read (10,*) i
+ if (i /= 42) call abort
+ read (10,*) i
+ if (i /= -42) call abort
+ close (10,status="delete")
+
+ end
diff --git a/gcc/testsuite/gfortran.dg/open_access_append_2.f90 b/gcc/testsuite/gfortran.dg/open_access_append_2.f90
new file mode 100644
index 00000000000..3661bb0b2f8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/open_access_append_2.f90
@@ -0,0 +1,5 @@
+! { dg-do run }
+! Testcase for the GNU extension OPEN(...,ACCESS="APPEND")
+ open (10,err=900,access="append",position="asis") ! { dg-output ".*Extension.*" }
+ call abort
+ 900 end
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 29ebfd270ca..1fa17337515 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,10 @@
+2005-11-17 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR fortran/24892
+ * io/io.h (unit_access): Add ACCESS_APPEND.
+ * io/open.c (access_opt): Add APPEND value for ACCESS keyword.
+ (st_open): Use that new value to set the POSITION accordingly.
+
2005-11-14 Janne Blomqvist <jb@gcc.gnu.org>
PR fortran/21468
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index e26267720e1..47a564f5e7d 100644
--- a/libgfortran/io/io.h
+++ b/libgfortran/io/io.h
@@ -153,7 +153,7 @@ namelist_info;
/* Options for the OPEN statement. */
typedef enum
-{ ACCESS_SEQUENTIAL, ACCESS_DIRECT,
+{ ACCESS_SEQUENTIAL, ACCESS_DIRECT, ACCESS_APPEND,
ACCESS_UNSPECIFIED
}
unit_access;
diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c
index 203964b5dea..c3b5dde25ac 100644
--- a/libgfortran/io/open.c
+++ b/libgfortran/io/open.c
@@ -39,6 +39,7 @@ Boston, MA 02110-1301, USA. */
static const st_option access_opt[] = {
{"sequential", ACCESS_SEQUENTIAL},
{"direct", ACCESS_DIRECT},
+ {"append", ACCESS_APPEND},
{NULL, 0}
};
@@ -486,6 +487,19 @@ st_open (void)
generate_error (ERROR_BAD_OPTION,
"Cannot use POSITION with direct access files");
+ if (flags.access == ACCESS_APPEND)
+ {
+ if (flags.position != POSITION_UNSPECIFIED
+ && flags.position != POSITION_APPEND)
+ generate_error (ERROR_BAD_OPTION, "Conflicting ACCESS and POSITION "
+ "flags in OPEN statement");
+
+ notify_std (GFC_STD_GNU,
+ "Extension: APPEND as a value for ACCESS in OPEN statement");
+ flags.access = ACCESS_SEQUENTIAL;
+ flags.position = POSITION_APPEND;
+ }
+
if (flags.position == POSITION_UNSPECIFIED)
flags.position = POSITION_ASIS;