re PR fortran/35036 (illegal E format descriptor produces wrong output)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Thu, 21 Feb 2008 02:20:27 +0000 (02:20 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Thu, 21 Feb 2008 02:20:27 +0000 (02:20 +0000)
2008-02-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libfortran/35036
* write_float.def (output_float):  Add error checks for zero digits
after decimal point in E and D format specifiers.

From-SVN: r132510

libgfortran/ChangeLog
libgfortran/io/write_float.def

index 6260ed30b4412b2ae714beef246ddccf89baa6b7..dcc52a5c1e904e2abca6762e5c8112b8ab5d2dd1 100644 (file)
@@ -1,3 +1,9 @@
+2008-02-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libfortran/35036
+       * write_float.def (output_float):  Add error checks for zero digits
+       after decimal point in E and D format specifiers.
+       
 2008-02-10  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libfortran/35063
index 4642013ae984396e267352011d734b5ac9e7ed93..028fd27b863bb393ef1f46fc5231996f6d04d978 100644 (file)
@@ -167,6 +167,19 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
     case FMT_E:
     case FMT_D:
       i = dtp->u.p.scale_factor;
+      if (d <= 0 && i == 0)
+       {
+         generate_error (&dtp->common, LIBERROR_FORMAT, "Precision not "
+                         "greater than zero in format specifier 'E' or 'D'");
+         return;
+       }
+      if (i <= -d || i >= d + 2)
+       {
+         generate_error (&dtp->common, LIBERROR_FORMAT, "Scale factor "
+                         "out of range in format specifier 'E' or 'D'");
+         return;
+       }
+
       if (!zero_flag)
        e -= i;
       if (i < 0)