From 94d342534efdfcdbc6410c9247ec81a2c13217e9 Mon Sep 17 00:00:00 2001 From: Bud Davis Date: Sun, 23 Aug 2009 02:19:59 +0000 Subject: [PATCH] [multiple changes] 2009-08-22 Bud Davis PR fortran/28093 * io.c : added variable to store original len of fmt * io.c (check_format): Consume H items using next_char in both modes to handle consecutive single quotes. Test for extra characters in fmt, issue warning. 2009-08-22 Bud Davis PR fortran/28039 * gfortran.dg/fmt_with_extra.f: new file. From-SVN: r151021 --- gcc/fortran/ChangeLog | 8 ++++++ gcc/fortran/io.c | 29 +++++++++++----------- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gfortran.dg/fmt_with_extra.f | 8 ++++++ 4 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/fmt_with_extra.f diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 53a9d6d99ec..635e68cb88b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2009-08-22 Bud Davis + + PR fortran/28093 + * io.c : added variable to store original len of fmt + * io.c (check_format): Consume H items using next_char + in both modes to handle consecutive single quotes. + Test for extra characters in fmt, issue warning. + 2009-08-21 Janus Weil PR fortran/41106 diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index f11ea38f729..4f60b80db40 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -121,6 +121,7 @@ format_token; static gfc_char_t *format_string; static int format_string_pos; static int format_length, use_last_char; +static int starting_format_length; static char error_element; static locus format_locus; @@ -875,20 +876,11 @@ data_desc: gfc_warning ("The H format specifier at %L is" " a Fortran 95 deleted feature", &format_locus); } - - if (mode == MODE_STRING) - { - format_string += value; - format_length -= value; - } - else - { - while (repeat >0) - { - next_char (1); - repeat -- ; - } - } + while (repeat >0) + { + next_char (1); + repeat -- ; + } break; case FMT_IBOZ: @@ -1039,6 +1031,13 @@ fail: rv = FAILURE; finished: + /* check for extraneous characters at end of valid format string */ + if ( starting_format_length > format_length ) + { + format_locus.nextc += format_length + 1; /* point to the extra */ + gfc_warning ("Extraneous characters in format at %L", &format_locus); + } + return rv; } @@ -1054,7 +1053,7 @@ check_format_string (gfc_expr *e, bool is_input) mode = MODE_STRING; format_string = e->value.character.string; - + starting_format_length = e->value.character.length; /* More elaborate measures are needed to show where a problem is within a format string that has been calculated, but that's probably not worth the effort. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 90308c96fde..8e60e36d317 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-08-22 Bud Davis + + PR fortran/28039 + * gfortran.dg/fmt_with_extra.f: new file. 2009-08-21 Maciej W. Rozycki * lib/target-supports.exp diff --git a/gcc/testsuite/gfortran.dg/fmt_with_extra.f b/gcc/testsuite/gfortran.dg/fmt_with_extra.f new file mode 100644 index 00000000000..45664be906f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/fmt_with_extra.f @@ -0,0 +1,8 @@ +! { dg-do compile } +! test case contributed by tobias.burnus@physik.fu-berlin.de +! PR28039 Warn when ignoring extra characters in the format specification + implicit none + real :: r + r = 1.0 + write(*,'(a),f)') 'Hello', r !{ dg-warning "Extraneous characters in format at" } + end