diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2005-07-09 09:33:31 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2005-07-09 09:33:31 +0000 |
commit | 999a06a0da6405ea441a5079733906ffd3a441d4 (patch) | |
tree | 4b8d9c37e024396926922d352c6ef52a2dc2bd68 | |
parent | 4a8ce6ce048eee4d123115c63423c7a0aefafeea (diff) | |
download | gcc-999a06a0da6405ea441a5079733906ffd3a441d4.zip gcc-999a06a0da6405ea441a5079733906ffd3a441d4.tar.gz gcc-999a06a0da6405ea441a5079733906ffd3a441d4.tar.bz2 |
[multiple changes]
2005-07-07 Francois-Xavier Coudert <coudert@clipper.ens.fr>
Thomas Koenig <Thomas.Koenig@online.de>
PR libfortran/22217
* io/write.c (extract_unit): New function; extract
ints as unsigned signed int of the correct size.
* io/write.c (write_int): Use it.
* runtime/error.c: Adjust copyright years.
Adjust size of buffer to maximum that can occur.
2005-07-07 Thomas Koenig <Thomas.Koenig@online.de>
PR libfortran/22217
* gfortran.dg/negative-z-descriptor.f90: New test.
From-SVN: r101829
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/negative-z-descriptor.f90 | 27 | ||||
-rw-r--r-- | libgfortran/ChangeLog | 10 | ||||
-rw-r--r-- | libgfortran/io/write.c | 36 | ||||
-rw-r--r-- | libgfortran/runtime/error.c | 5 |
5 files changed, 80 insertions, 3 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f61b473..7717a13 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-07-09 Thomas Koenig <Thomas.Koenig@online.de> + + PR libfortran/22217 + * gfortran.dg/negative-z-descriptor.f90: New test. + 2005-07-08 Andrew Pinski <pinskia@physics.uc.edu> PR tree-opt/22329 diff --git a/gcc/testsuite/gfortran.dg/negative-z-descriptor.f90 b/gcc/testsuite/gfortran.dg/negative-z-descriptor.f90 new file mode 100644 index 0000000..1ad3a32 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/negative-z-descriptor.f90 @@ -0,0 +1,27 @@ +! { dg-do run } +! PR 22217: Z edit descriptor with negative numbers used to give lots of * + +program main + character(len=70) line + character(len=20) fmt + write(unit=line,fmt='(Z4)') -1_1 + if (line(1:4) .ne. ' FF') call abort + write(unit=line,fmt='(Z5)') -1_2 + if (line(1:5) .ne. ' FFFF') call abort + write(unit=line,fmt='(Z9)') -1_4 + if (line(1:9) .ne. ' FFFFFFFF') call abort + write(unit=line,fmt='(Z17)') -2_8 + if (line(1:17) .ne. ' FFFFFFFFFFFFFFFE') call abort + write(unit=line,fmt='(Z2)') 10_8 + if (line(1:2) .ne. ' A') call abort + + write(unit=line,fmt='(Z8)') -43_8 + if (line(1:1) .ne. '*') call abort + + write(unit=line,fmt='(B65)') -1_8 + if (line(1:2) .ne. ' 1') call abort + if (line(64:66) .ne. '11 ') call abort + + write(unit=line,fmt='(O4)') -2_1 + if (line(1:4) .ne. ' 376') call abort +end diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 9fb6c5b..a73202d 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,13 @@ +2005-07-09 Francois-Xavier Coudert <coudert@clipper.ens.fr> + Thomas Koenig <Thomas.Koenig@online.de> + + PR libfortran/22217 + * io/write.c (extract_unit): New function; extract + ints as unsigned signed int of the correct size. + * io/write.c (write_int): Use it. + * runtime/error.c: Adjust copyright years. + Adjust size of buffer to maximum that can occur. + 2005-07-07 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de> * libgfortran.h (GFC_ARRAY_DESCRIPTOR): Replace 'type *base' by diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 0e2a3ac..5603d6d 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -102,6 +102,40 @@ extract_int (const void *p, int len) return i; } +static GFC_UINTEGER_LARGEST +extract_uint (const void *p, int len) +{ + GFC_UINTEGER_LARGEST i = 0; + + if (p == NULL) + return i; + + switch (len) + { + case 1: + i = (GFC_UINTEGER_1) *((const GFC_INTEGER_1 *) p); + break; + case 2: + i = (GFC_UINTEGER_2) *((const GFC_INTEGER_2 *) p); + break; + case 4: + i = (GFC_UINTEGER_4) *((const GFC_INTEGER_4 *) p); + break; + case 8: + i = (GFC_UINTEGER_8) *((const GFC_INTEGER_8 *) p); + break; +#ifdef HAVE_GFC_INTEGER_16 + case 16: + i = (GFC_UINTEGER_16) *((const GFC_INTEGER_16 *) p); + break; +#endif + default: + internal_error ("bad integer kind"); + } + + return i; +} + static GFC_REAL_LARGEST extract_real (const void *p, int len) { @@ -802,7 +836,7 @@ write_int (fnode *f, const char *source, int len, w = f->u.integer.w; m = f->u.integer.m; - n = extract_int (source, len); + n = extract_uint (source, len); /* Special case: */ diff --git a/libgfortran/runtime/error.c b/libgfortran/runtime/error.c index 8b42041..ff91b96 100644 --- a/libgfortran/runtime/error.c +++ b/libgfortran/runtime/error.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002-2003 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. Contributed by Andy Vaught This file is part of the GNU Fortran 95 runtime library (libgfortran). @@ -63,7 +63,8 @@ iexport_data(filename); unsigned line = 0; iexport_data(line); -static char buffer[32]; /* buffer for integer/ascii conversions */ +/* buffer for integer/ascii conversions. */ +static char buffer[sizeof (GFC_UINTEGER_LARGEST) * 8 + 1]; /* Returns a pointer to a static buffer. */ |