aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2008-09-02 08:50:13 +0000
committerDaniel Kraft <domob@gcc.gnu.org>2008-09-02 10:50:13 +0200
commit900e887f6d2dd21c118f5de7cbcf3d56173a02a7 (patch)
tree317dab79bd42333332ad5ed9c18cf1fec7ff1af4 /gcc
parent52f4993488d2dd12d66dd99c2937e59319d0b1b6 (diff)
downloadgcc-900e887f6d2dd21c118f5de7cbcf3d56173a02a7.zip
gcc-900e887f6d2dd21c118f5de7cbcf3d56173a02a7.tar.gz
gcc-900e887f6d2dd21c118f5de7cbcf3d56173a02a7.tar.bz2
re PR fortran/37228 (F2008: Support g0.<d> edit descriptor)
2008-09-01 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/37228 * io.c (check_format): Allow specifying precision with g0 format. 2008-09-01 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libfortran/37301 PR libfortran/37228 * io/io.h (write_real_g0): Declare new function to handle g0.d format. * io/transfer.c (formatted_transfer_scalar): Use new function. * io/format.c (parse_format_list): Enable g0.d. * io/write.c (write_a_char4): Delete unused var. (set_fnode_default): New function to set the default fnode w, d, and e factored from write_real. (write_real): Use new factored function. (write_real_g0): New function that sets d to that passed by g0.d format specifier and set format to ES. Default values for w and e are used from the new function, set_fnode_default. 2008-09-01 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/37228 * gfortran.dg/fmt_g0_4.f08: Revised test. From-SVN: r139886
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/io.c25
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/fmt_g0_4.f0812
4 files changed, 32 insertions, 15 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index a878f0b..213af61 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,8 @@
+2008-09-01 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/37228
+ * io.c (check_format): Allow specifying precision with g0 format.
+
2008-09-02 Daniel Kraft <d@domob.eu>
* gfortran.h (struct gfc_namespace): New member `implicit_loc'.
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index 979dfc2..298c758 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -483,7 +483,6 @@ check_format (bool is_input)
" at %L");
const char *unexpected_end = _("Unexpected end of format string");
const char *zero_width = _("Zero width in format descriptor");
- const char *g0_precision = _("Specifying precision with G0 not allowed");
const char *error;
format_token t, u;
@@ -701,27 +700,25 @@ data_desc:
error = zero_width;
goto syntax;
}
-
if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: 'G0' in "
"format at %C") == FAILURE)
return FAILURE;
+ u = format_lex ();
+ if (u != FMT_PERIOD)
+ {
+ saved_token = u;
+ break;
+ }
u = format_lex ();
- if (u == FMT_PERIOD)
+ if (u == FMT_ERROR)
+ goto fail;
+ if (u != FMT_POSINT)
{
- error = g0_precision;
+ error = posint_required;
goto syntax;
}
- saved_token = u;
- goto between_desc;
- }
-
- if (u == FMT_ERROR)
- goto fail;
- if (u != FMT_POSINT)
- {
- error = posint_required;
- goto syntax;
+ break;
}
u = format_lex ();
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5557733..83d310f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-09-01 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/37228
+ * gfortran.dg/fmt_g0_4.f08: Revised test.
+
2008-09-02 Daniel Kraft <d@domob.eu>
* gfortran.dg/abstract_type_1.f90: New test.
diff --git a/gcc/testsuite/gfortran.dg/fmt_g0_4.f08 b/gcc/testsuite/gfortran.dg/fmt_g0_4.f08
index 149b1aa..500117e 100644
--- a/gcc/testsuite/gfortran.dg/fmt_g0_4.f08
+++ b/gcc/testsuite/gfortran.dg/fmt_g0_4.f08
@@ -1,5 +1,15 @@
! { dg-do compile }
! { dg-options "-std=f2008" }
! PR36725 Compile time error for g0 edit descriptor
-print '(g0.9)', 0.1 ! { dg-error "Specifying precision" }
+character(30) :: line
+write(line, '(g0.3)') 0.1
+if (line.ne." 1.000E-01") call abort
+write(line, '(g0.9)') 1.0
+if (line.ne."1.000000000E+00") call abort
+write(line, '(g0.5)') 29.23
+if (line.ne." 2.92300E+01") call abort
+write(line, '(g0.8)') -28.4
+if (line.ne."-2.83999996E+01") call abort
+write(line, '(g0.8)') -0.0001
+if (line.ne."-9.99999975E-05") call abort
end