diff options
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 24 | ||||
-rw-r--r-- | libgfortran/gfortran.map | 1 | ||||
-rw-r--r-- | libgfortran/io/format.c | 10 | ||||
-rw-r--r-- | libgfortran/io/list_read.c | 2 | ||||
-rw-r--r-- | libgfortran/libgfortran.h | 3 | ||||
-rw-r--r-- | libgfortran/runtime/error.c | 15 |
6 files changed, 51 insertions, 4 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 2437c4f379c..0eb171ce4b0 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,27 @@ +2008-07-27 Tobias Burnus <burnus@net-b.de> + + PR fortran/36132 + PR fortran/29952 + PR fortran/36909 + * runtime/error.c: New function runtime_error_at. + * gfortran.map: Ditto. + * libgfortran.h: Ditto. + +2008-07-22 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR fortran/36852 + * io/list_read.c: If variable rank is zero, do not adjust the found + namelist object pointer. + +2008-07-22 Daniel Kraft <d@domob.eu> + + PR fortran/29835 + * io/format.c (struct format_data): New member error_element. + (unexpected_element): Added '%c' to message. + (next_char): Keep track of last parsed character in fmt->error_element. + (format_error): If the message is unexpected_element, output the + offending character, too. + 2008-07-22 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/36890 diff --git a/libgfortran/gfortran.map b/libgfortran/gfortran.map index 0671b60fb86..93973d5b338 100644 --- a/libgfortran/gfortran.map +++ b/libgfortran/gfortran.map @@ -1072,6 +1072,7 @@ GFORTRAN_1.1 { _gfortran_pack_char4; _gfortran_pack_s_char4; _gfortran_reshape_char4; + _gfortran_runtime_warning_at; _gfortran_selected_char_kind; _gfortran_select_string_char4; _gfortran_spread_char4; diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c index cf299c161a4..02ce2913bd2 100644 --- a/libgfortran/io/format.c +++ b/libgfortran/io/format.c @@ -50,6 +50,7 @@ typedef struct format_data { char *format_string, *string; const char *error; + char error_element; format_token saved_token; int value, format_string_len, reversion_ok; fnode *avail; @@ -67,7 +68,7 @@ static const fnode colon_node = { FMT_COLON, 0, NULL, NULL, {{ 0, 0, 0 }}, 0, static const char posint_required[] = "Positive width required in format", period_required[] = "Period required in format", nonneg_required[] = "Nonnegative width required in format", - unexpected_element[] = "Unexpected element in format", + unexpected_element[] = "Unexpected element '%c' in format\n", unexpected_end[] = "Unexpected end of format string", bad_string[] = "Unterminated character constant in format", bad_hollerith[] = "Hollerith constant extends past the end of the format", @@ -89,7 +90,7 @@ next_char (format_data *fmt, int literal) return -1; fmt->format_string_len--; - c = toupper (*fmt->format_string++); + fmt->error_element = c = toupper (*fmt->format_string++); } while ((c == ' ' || c == '\t') && !literal); @@ -948,7 +949,10 @@ format_error (st_parameter_dt *dtp, const fnode *f, const char *message) if (f != NULL) fmt->format_string = f->source; - sprintf (buffer, "%s\n", message); + if (message == unexpected_element) + sprintf (buffer, message, fmt->error_element); + else + sprintf (buffer, "%s\n", message); j = fmt->format_string - dtp->format; diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index ba8de9750e1..34e2ac0698a 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -2791,7 +2791,7 @@ get_name: if (nl->type == GFC_DTYPE_DERIVED) nml_touch_nodes (nl); - if (component_flag) + if (component_flag && nl->var_rank > 0) nl = first_nl; /* Make sure no extraneous qualifiers are there. */ diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h index 10439bd3e5a..7c497004a81 100644 --- a/libgfortran/libgfortran.h +++ b/libgfortran/libgfortran.h @@ -643,6 +643,9 @@ extern void runtime_error_at (const char *, const char *, ...) __attribute__ ((noreturn, format (printf, 2, 3))); iexport_proto(runtime_error_at); +extern void runtime_warning_at (const char *, const char *, ...); +iexport_proto(runtime_warning_at); + extern void internal_error (st_parameter_common *, const char *) __attribute__ ((noreturn)); internal_proto(internal_error); diff --git a/libgfortran/runtime/error.c b/libgfortran/runtime/error.c index 8cd966fa23f..0b9c16705eb 100644 --- a/libgfortran/runtime/error.c +++ b/libgfortran/runtime/error.c @@ -285,6 +285,21 @@ runtime_error_at (const char *where, const char *message, ...) iexport(runtime_error_at); +void +runtime_warning_at (const char *where, const char *message, ...) +{ + va_list ap; + + st_printf ("%s\n", where); + st_printf ("Fortran runtime warning: "); + va_start (ap, message); + st_vprintf (message, ap); + va_end (ap); + st_printf ("\n"); +} +iexport(runtime_warning_at); + + /* void internal_error()-- These are this-can't-happen errors * that indicate something deeply wrong. */ |