aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2004-08-28 19:48:02 +0000
committerPaul Brook <pbrook@gcc.gnu.org>2004-08-28 19:48:02 +0000
commit7984a2f04bb29eff5850be9f99c2ef0f879c862a (patch)
tree0371510fa89dbbdbb79289c112c2ac3536729a99 /gcc
parent39b8ce7f98a09a10142cfb3dd9bfe4636dd86d3d (diff)
downloadgcc-7984a2f04bb29eff5850be9f99c2ef0f879c862a.zip
gcc-7984a2f04bb29eff5850be9f99c2ef0f879c862a.tar.gz
gcc-7984a2f04bb29eff5850be9f99c2ef0f879c862a.tar.bz2
re PR libfortran/17195 (Infinite loop in output_float in libgfortran/io/write.c)
PR libfortran/17195 * libgfortran.h (rtoa): Remove prototype. * runtime/error.c (rtoa): Remove. * io/write.c (calculate_G_format): Don't add blanks if E format is used. Add correct number of blanks when exponent width is specified. (output_float): Rewrite. testsuite/ * gfortran.dg/edit_real_1.f90: New test. From-SVN: r86701
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/edit_real_1.f9066
2 files changed, 71 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 20b6267..beb4aa1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-08-28 Paul Brook <paul@codesourcery.com>
+
+ PR libfortran/17195
+ * gfortran.dg/edit_real_1.f90: New test.
+
2004-08-27 Paul Brook <paul@codesourcery.com>
* gfortran.dg/rewind_1.f90: New test.
diff --git a/gcc/testsuite/gfortran.dg/edit_real_1.f90 b/gcc/testsuite/gfortran.dg/edit_real_1.f90
new file mode 100644
index 0000000..3ecd4ff
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/edit_real_1.f90
@@ -0,0 +1,66 @@
+! { dg-do run }
+! Check real value edit descriptors
+! Also checks that rounding is performed correctly
+program edit_real_1
+ character(len=20) s
+ character(len=20) x
+ character(len=200) t
+ parameter (x = "xxxxxxxxxxxxxxxxxxxx")
+
+ ! W append a "z" onto each test to check the field is the correct width
+ s = x
+ ! G -> F format
+ write (s, '(G10.3,A)') 12.36, "z"
+ if (s .ne. " 12.4 z") call abort
+ s = x
+ ! G -> E format
+ write (s, '(G10.3,A)') -0.0012346, "z"
+ if (s .ne. "-0.123E-02z") call abort
+ s = x
+ ! Gw.eEe format
+ write (s, '(G10.3e1,a)') 12.34, "z"
+ if (s .ne. " 12.3 z") call abort
+ ! E format with excessive precision
+ write (t, '(E199.192,A)') 1.5, "z"
+ if ((t(1:7) .ne. " 0.1500") .or. (t(194:200) .ne. "00E+01z")) call abort
+ ! EN format
+ s = x
+ write (s, '(EN15.3,A)') 12873.6, "z"
+ if (s .ne. " 12.874E+03z") call abort
+ ! EN format, negative exponent
+ s = x
+ write (s, '(EN15.3,A)') 12.345e-6, "z"
+ if (s .ne. " 12.345E-06z") call abort
+ ! ES format
+ s = x
+ write (s, '(ES10.3,A)') 16.235, "z"
+ if (s .ne. " 1.624E+01z") call abort
+ ! F format, small number
+ s = x
+ write (s, '(F10.8,A)') 1.0e-20, "z"
+ if (s .ne. "0.00000000z") call abort
+ ! E format, very large number.
+ ! Used to overflow with positive scale factor
+ s = x
+ write (s, '(1PE10.3,A)') huge(0d0), "z"
+ ! The actual value is target specific, so just do a basic check
+ if ((s(1:1) .eq. "*") .or. (s(7:7) .ne. "+") .or. &
+ (s(11:11) .ne. "z")) call abort
+ ! F format, round up with carry to most significant digit.
+ s = x
+ write (s, '(F10.3,A)') 0.9999, "z"
+ if (s .ne. " 1.000z") call abort
+ ! F format, round up with carry to most significant digit < 0.1.
+ s = x
+ write (s, '(F10.3,A)') 0.0099, "z"
+ if (s .ne. " 0.010z") call abort
+ ! E format, round up with carry to most significant digit.
+ s = x
+ write (s, '(E10.3,A)') 0.9999, "z"
+ if (s .ne. " 0.100E+01z") call abort
+ ! EN format, round up with carry to most significant digit.
+ s = x
+ write (s, '(EN15.3,A)') 999.9999, "z"
+ if (s .ne. " 1.000E+03z") call abort
+end
+