aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBud Davis <bdavis9659@comcast.net>2004-08-25 00:31:33 +0000
committerBud Davis <bdavis@gcc.gnu.org>2004-08-25 00:31:33 +0000
commit5352bda03ee91af3e4592d0f62178fae15daab40 (patch)
tree8fea482f4eead23b6036f3b25416d71571d83c8c
parent0d9f6a32e752c86c85053d46262e9bf901399a68 (diff)
downloadgcc-5352bda03ee91af3e4592d0f62178fae15daab40.zip
gcc-5352bda03ee91af3e4592d0f62178fae15daab40.tar.gz
gcc-5352bda03ee91af3e4592d0f62178fae15daab40.tar.bz2
re PR libfortran/17143 (2**63 prints garbage)
2004-08-24 Bud Davis <bdavis9659@comcast.net> PR fortran/17143 * runtime/error.c (itoa): keep from overflowing during mod operation by using unsigned variable. * gfortran.dg/pr17143.f90: New test. From-SVN: r86532
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr17143.f9016
-rw-r--r--libgfortran/ChangeLog6
-rw-r--r--libgfortran/runtime/error.c10
4 files changed, 33 insertions, 4 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ba02334..9a442c4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2004-08-24 Bud Davis <bdavis9659@comcast.net>
+ PR fortran/17143
+ * gfortran.dg/pr17143.f90: New test.
+
+2004-08-24 Bud Davis <bdavis9659@comcast.net>
+
PR fortran/17164
* gfortran.dg/pr17164.f90: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr17143.f90 b/gcc/testsuite/gfortran.dg/pr17143.f90
new file mode 100644
index 0000000..4be4e2b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr17143.f90
@@ -0,0 +1,16 @@
+! pr17143
+! does not print 2*63 correctly
+ character*25 l
+ integer*8 i
+ data i /1/
+ do j = 1,63
+ i = i * 2
+ end do
+ write(l,*)i
+ if (l.ne.' -9223372036854775808') then
+! ^
+! the space is required before a number
+ call abort
+ endif
+ end
+
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 1cb06dd..aff020d 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,5 +1,11 @@
2004-08-24 Bud Davis <bdavis9659@comcast.net>
+ PR fortran/17143
+ * runtime/error.c (itoa): keep from overflowing during
+ mod operation by using unsigned variable.
+
+2004-08-24 Bud Davis <bdavis9659@comcast.net>
+
PR fortran/17164
* runtime/string_intrinsics.c (string_index):check for
substring longer than string.
diff --git a/libgfortran/runtime/error.c b/libgfortran/runtime/error.c
index 8cd980d..448ead8 100644
--- a/libgfortran/runtime/error.c
+++ b/libgfortran/runtime/error.c
@@ -117,6 +117,7 @@ itoa (int64_t n)
{
int negative;
char *p;
+ uint64_t t;
if (n == 0)
{
@@ -126,19 +127,20 @@ itoa (int64_t n)
}
negative = 0;
+ t = n;
if (n < 0)
{
negative = 1;
- n = -n;
+ t = -n; /*must use unsigned to protect from overflow*/
}
p = buffer + sizeof (buffer) - 1;
*p-- = '\0';
- while (n != 0)
+ while (t != 0)
{
- *p-- = '0' + (n % 10);
- n /= 10;
+ *p-- = '0' + (t % 10);
+ t /= 10;
}
if (negative)