diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2016-02-23 18:38:31 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2016-02-23 18:38:31 +0000 |
commit | 64a454d9f74cecd95241e96fef281b64715049c4 (patch) | |
tree | f181cd7389d8bad1a96d98fe725f9b3dc253f400 /libgfortran/io | |
parent | 35886f0bd4a8bcb1fe8b5f60d76fb94e5a0d4f9a (diff) | |
download | gcc-64a454d9f74cecd95241e96fef281b64715049c4.zip gcc-64a454d9f74cecd95241e96fef281b64715049c4.tar.gz gcc-64a454d9f74cecd95241e96fef281b64715049c4.tar.bz2 |
re PR fortran/69456 (Namelist value with trailing sign is ignored without error)
2016-02-23 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/69456
* io/list_read.c (read_real): If digit is missing from exponent issue
an error. (parse_real): Likewise and adjusted error message to clarify
it is part of a complex number.
(nml_read_obj): Bump item count and add comment that this is used to
identify which item in a namelist read has a problem.
PR libgfortran/69456
* gfortran.dg/namelist_89.f90: New test.
* gfortran.dg/pr59700.f90: Update test..
From-SVN: r233641
Diffstat (limited to 'libgfortran/io')
-rw-r--r-- | libgfortran/io/list_read.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index bebdd8c..e24b392 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -1374,7 +1374,7 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length) exp2: if (!isdigit (c)) - goto bad; + goto bad_exponent; push_char (dtp, c); @@ -1472,6 +1472,8 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length) if (nml_bad_return (dtp, c)) return 0; + bad_exponent: + free_saved (dtp); if (c == EOF) { @@ -1482,8 +1484,8 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length) else if (c != '\n') eat_line (dtp); - snprintf (message, MSGLEN, "Bad floating point number for item %d", - dtp->u.p.item_count); + snprintf (message, MSGLEN, "Bad complex floating point " + "number for item %d", dtp->u.p.item_count); free_line (dtp); generate_error (&dtp->common, LIBERROR_READ_VALUE, message); @@ -1814,7 +1816,8 @@ read_real (st_parameter_dt *dtp, void * dest, int length) exp2: if (!isdigit (c)) - goto bad_real; + goto bad_exponent; + push_char (dtp, c); for (;;) @@ -1983,6 +1986,8 @@ read_real (st_parameter_dt *dtp, void * dest, int length) if (nml_bad_return (dtp, c)) return; + bad_exponent: + free_saved (dtp); if (c == EOF) { @@ -2810,6 +2815,7 @@ nml_read_obj (st_parameter_dt *dtp, namelist_info * nl, index_type offset, if (dtp->u.p.nml_read_error || !nl->touched) return true; + dtp->u.p.item_count++; /* Used in error messages. */ dtp->u.p.repeat_count = 0; eat_spaces (dtp); |