summaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2010-06-28 22:04:40 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2010-06-28 22:04:40 +0200
commit83377c6a3f5a2b1e0d3ecd718cfa7fc701f32aa4 (patch)
tree6c019cf873b129f993fd59f070c6f6e47c3df1ba /libgfortran
parent9589f23ea556ef4d3b083a83e49156780b6b9cde (diff)
downloadgcc-83377c6a3f5a2b1e0d3ecd718cfa7fc701f32aa4.tar.gz
re PR libfortran/43298 (fortran library does not read in NaN -Inf or Inf)
2010-06-28 Tobias Burnus <burnus@net-b.de> PR fortran/43298 * list_read.c (parse_real, read_real): Support NAN(alphanum). 2010-06-28 Tobias Burnus <burnus@net-b.de> PR fortran/43298 * gfortran.dg/nan_6.f90: New. From-SVN: r161510
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog5
-rw-r--r--libgfortran/io/list_read.c29
2 files changed, 34 insertions, 0 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 3c2c75cd1b1..33a312cebdc 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,8 @@
+2010-06-28 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/43298
+ * list_read.c (parse_real, read_real): Support NAN(alphanum).
+
2010-06-25 Tobias Burnus <burnus@net-b.de>
* intrinsics/selected_real_kind.f90
diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c
index 798521d62ad..72016b73e29 100644
--- a/libgfortran/io/list_read.c
+++ b/libgfortran/io/list_read.c
@@ -1199,6 +1199,21 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length)
push_char (dtp, 'n');
push_char (dtp, 'a');
push_char (dtp, 'n');
+
+ /* Match "NAN(alphanum)". */
+ if (c == '(')
+ {
+ 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);
+ }
goto done;
}
@@ -1576,6 +1591,20 @@ read_real (st_parameter_dt *dtp, void * dest, int length)
goto unwind;
c = next_char (dtp);
l_push_char (dtp, c);
+
+ /* Match NAN(alphanum). */
+ if (c == '(')
+ {
+ for (c = next_char (dtp); c != ')'; c = next_char (dtp))
+ if (is_separator (c))
+ goto unwind;
+ else
+ l_push_char (dtp, c);
+
+ l_push_char (dtp, ')');
+ c = next_char (dtp);
+ l_push_char (dtp, c);
+ }
}
if (!is_separator (c))