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 + + 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 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 + + 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 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;