diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2014-01-11 18:57:20 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2014-01-11 18:57:20 +0000 |
commit | 2558e2e838790ef1441788c0ba4c14e1bf061b55 (patch) | |
tree | 7ee42a08f421ada38d46c6736afc7fd555ce17a2 /libgfortran/io | |
parent | 2c4074268983c92c1c8554b591a6877b4e92d7bb (diff) | |
download | gcc-2558e2e838790ef1441788c0ba4c14e1bf061b55.zip gcc-2558e2e838790ef1441788c0ba4c14e1bf061b55.tar.gz gcc-2558e2e838790ef1441788c0ba4c14e1bf061b55.tar.bz2 |
re PR fortran/59700 (Misleading/buggy runtime error message: Bad integer for item 0 in list input)
2014-01-11 Jerry DeLisle <jvdelisle@gcc.gnu>
Dominique d'Humieres <dominiq@lps.ens.fr>
Steven G. Kargl <kargl@gcc.gnu.org>
PR libfortran/59700
PR libfortran/59764
* io/io.h (struct st_parameter_dt): Assign expanded_read flag to
unused bit. Define new variable line_buffer_pos.
* io/list_read.c (free_saved, next_char, l_push_char,
read_logical, read_real): Replace use of item_count with
line_buffer_pos for line_buffer look ahead.
(read_logical, read_integer, parse_real, read_real, check_type):
Adjust location of free_line to after generating error messages
to retain the correct item count for the message.
Co-Authored-By: Dominique d'Humieres <dominiq@lps.ens.fr>
Co-Authored-By: Steven G. Kargl <kargl@gcc.gnu.org>
From-SVN: r206553
Diffstat (limited to 'libgfortran/io')
-rw-r--r-- | libgfortran/io/io.h | 10 | ||||
-rw-r--r-- | libgfortran/io/list_read.c | 41 |
2 files changed, 28 insertions, 23 deletions
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h index 97f7a6a..3481c83 100644 --- a/libgfortran/io/io.h +++ b/libgfortran/io/io.h @@ -430,7 +430,10 @@ typedef struct st_parameter_dt unsigned g0_no_blanks : 1; /* Used to signal use of free_format_data. */ unsigned format_not_saved : 1; - /* 14 unused bits. */ + /* A flag used to identify when a non-standard expanded namelist read + has occurred. */ + unsigned expanded_read : 1; + /* 13 unused bits. */ /* Used for ungetc() style functionality. Possible values are an unsigned char, EOF, or EOF - 1 used to mark the @@ -447,9 +450,8 @@ typedef struct st_parameter_dt char *line_buffer; struct format_data *fmt; namelist_info *ionml; - /* A flag used to identify when a non-standard expanded namelist read - has occurred. */ - int expanded_read; + /* Current position within the look-ahead line buffer. */ + int line_buffer_pos; /* Storage area for values except for strings. Must be large enough to hold a complex value (two reals) of the largest kind. */ diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index a37cfcb..942f311 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -118,7 +118,7 @@ free_saved (st_parameter_dt *dtp) static void free_line (st_parameter_dt *dtp) { - dtp->u.p.item_count = 0; + dtp->u.p.line_buffer_pos = 0; dtp->u.p.line_buffer_enabled = 0; if (dtp->u.p.line_buffer == NULL) @@ -150,15 +150,15 @@ next_char (st_parameter_dt *dtp) { dtp->u.p.at_eol = 0; - c = dtp->u.p.line_buffer[dtp->u.p.item_count]; - if (c != '\0' && dtp->u.p.item_count < 64) + c = dtp->u.p.line_buffer[dtp->u.p.line_buffer_pos]; + if (c != '\0' && dtp->u.p.line_buffer_pos < 64) { - dtp->u.p.line_buffer[dtp->u.p.item_count] = '\0'; - dtp->u.p.item_count++; + dtp->u.p.line_buffer[dtp->u.p.line_buffer_pos] = '\0'; + dtp->u.p.line_buffer_pos++; goto done; } - dtp->u.p.item_count = 0; + dtp->u.p.line_buffer_pos = 0; dtp->u.p.line_buffer_enabled = 0; } @@ -639,7 +639,7 @@ l_push_char (st_parameter_dt *dtp, char c) if (dtp->u.p.line_buffer == NULL) dtp->u.p.line_buffer = xcalloc (SCRATCH_SIZE, 1); - dtp->u.p.line_buffer[dtp->u.p.item_count++] = c; + dtp->u.p.line_buffer[dtp->u.p.line_buffer_pos++] = c; } @@ -749,7 +749,7 @@ read_logical (st_parameter_dt *dtp, int length) { dtp->u.p.nml_read_error = 1; dtp->u.p.line_buffer_enabled = 1; - dtp->u.p.item_count = 0; + dtp->u.p.line_buffer_pos = 0; return; } @@ -757,14 +757,17 @@ read_logical (st_parameter_dt *dtp, int length) bad_logical: - free_line (dtp); - if (nml_bad_return (dtp, c)) - return; + { + free_line (dtp); + return; + } + free_saved (dtp); if (c == EOF) { + free_line (dtp); hit_eof (dtp); return; } @@ -772,6 +775,7 @@ read_logical (st_parameter_dt *dtp, int length) eat_line (dtp); snprintf (message, MSGLEN, "Bad logical value while reading item %d", dtp->u.p.item_count); + free_line (dtp); generate_error (&dtp->common, LIBERROR_READ_VALUE, message); return; @@ -912,9 +916,9 @@ read_integer (st_parameter_dt *dtp, int length) else if (c != '\n') eat_line (dtp); - free_line (dtp); snprintf (message, MSGLEN, "Bad integer for item %d in list input", dtp->u.p.item_count); + free_line (dtp); generate_error (&dtp->common, LIBERROR_READ_VALUE, message); return; @@ -1297,9 +1301,9 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length) else if (c != '\n') eat_line (dtp); - free_line (dtp); snprintf (message, MSGLEN, "Bad floating point number for item %d", dtp->u.p.item_count); + free_line (dtp); generate_error (&dtp->common, LIBERROR_READ_VALUE, message); return 1; @@ -1405,9 +1409,9 @@ eol_4: else if (c != '\n') eat_line (dtp); - free_line (dtp); snprintf (message, MSGLEN, "Bad complex value in item %d of list input", dtp->u.p.item_count); + free_line (dtp); generate_error (&dtp->common, LIBERROR_READ_VALUE, message); } @@ -1769,7 +1773,7 @@ read_real (st_parameter_dt *dtp, void * dest, int length) { dtp->u.p.nml_read_error = 1; dtp->u.p.line_buffer_enabled = 1; - dtp->u.p.item_count = 0; + dtp->u.p.line_buffer_pos = 0; return; } @@ -1788,9 +1792,9 @@ read_real (st_parameter_dt *dtp, void * dest, int length) else if (c != '\n') eat_line (dtp); - free_line (dtp); snprintf (message, MSGLEN, "Bad real number in item %d of list input", dtp->u.p.item_count); + free_line (dtp); generate_error (&dtp->common, LIBERROR_READ_VALUE, message); } @@ -1805,11 +1809,10 @@ check_type (st_parameter_dt *dtp, bt type, int kind) if (dtp->u.p.saved_type != BT_UNKNOWN && dtp->u.p.saved_type != type) { - free_line (dtp); snprintf (message, MSGLEN, "Read type %s where %s was expected for item %d", type_name (dtp->u.p.saved_type), type_name (type), dtp->u.p.item_count); - + free_line (dtp); generate_error (&dtp->common, LIBERROR_READ_VALUE, message); return 1; } @@ -1820,13 +1823,13 @@ check_type (st_parameter_dt *dtp, bt type, int kind) if ((type != BT_COMPLEX && dtp->u.p.saved_length != kind) || (type == BT_COMPLEX && dtp->u.p.saved_length != kind*2)) { - free_line (dtp); snprintf (message, MSGLEN, "Read kind %d %s where kind %d is required for item %d", type == BT_COMPLEX ? dtp->u.p.saved_length / 2 : dtp->u.p.saved_length, type_name (dtp->u.p.saved_type), kind, dtp->u.p.item_count); + free_line (dtp); generate_error (&dtp->common, LIBERROR_READ_VALUE, message); return 1; } |