------- Comment #15 from burnus at gcc dot gnu dot org 2010-07-02 07:09 -------
(In reply to comment #14)
> gfortran.dg/nan_6.f90 fails on hppa2.0w-hp-hpux11:
> Breakpoint 2, MAIN__ ()
> at /test/gnu/gcc/gcc/gcc/testsuite/gfortran.dg/nan_6.f90:89
> 89 if (.not. isnan(real(z))) call abort()
> (gdb) p z
> $1 = 0 + 0 * I
Seemingly hppa2.0w-hp-hpux11's strtod is unable to handle a POSIX conform NAN
of the form "NAN(n-char-sequence_opt)" as the failure occurs for
'(NAN(0x111),0.0)'
For the relevant quote from POSIX, see comment 4. (John, you could thus
consider to fill a bugreport at HP.)
The simplest solution is to ignore the (...) part - as already done for
formatted I/O and read_real. While the value is in principle usable (by
evaluating the bits), probably no one uses it. Or as POSIX puts it:
"the meaning of the n-char sequences is implementation-defined."
Jerry, John, what do you think?
Untested patch:
diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c
index 72016b7..c88edf6 100644
--- a/libgfortran/io/list_read.c
+++ b/libgfortran/io/list_read.c
@@ -1206,10 +1206,7 @@ parse_real (st_parameter_dt *dtp, void *buffer, int
length)
for ( ; c != ')'; c = next_char (dtp))
if (is_separator (c))
goto bad;
- else
- push_char (dtp, c);
- push_char (dtp, ')');
c = next_char (dtp);
if (is_separator (c))
unget_char (dtp, c);
diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c
index 873d26c..12aa098 100644
--- a/libgfortran/io/read.c
+++ b/libgfortran/io/read.c
@@ -131,11 +131,10 @@ max_value (int length, int signed_flag)
/* convert_real()-- Convert a character representation of a floating
- * point number to the machine number. Returns nonzero if there is a
- * range problem during conversion. Note: many architectures
- * (e.g. IA-64, HP-PA) require that the storage pointed to by the dest
- * argument is properly aligned for the type in question. TODO:
- * handle not-a-numbers and infinities. */
+ point number to the machine number. Returns nonzero if there is a
+ range problem during conversion. Note: many architectures
+ (e.g. IA-64, HP-PA) require that the storage pointed to by the dest
+ argument is properly aligned for the type in question. */
int
convert_real (st_parameter_dt *dtp, void *dest, const char *buffer, int
length)
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43298